ContentProvider既可以與調用方處在同一進程,也可以運行在單獨進程中,完全取決於ContentProvider所處的aplication的進程資訊。因此假如ContentProvider運行在單獨的進程中,那麼調用ContentProvider將會涉及到IPC通訊。
既然涉及到IPC通訊,那麼ContentProvider一定繼承自IInterface,這個IInterface就是IContentProvider,其主要的介面方法如下,
public IBulkCursor bulkQuery(Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder, IContentObserver observer, CursorWindow window) throws RemoteException; public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder) throws RemoteException; public String getType(Uri url) throws RemoteException; public Uri insert(Uri url, ContentValues initialValues) throws RemoteException; public int bulkInsert(Uri url, ContentValues[] initialValues) throws RemoteException; public int delete(Uri url, String selection, String[] selectionArgs) throws RemoteException; public int update(Uri url, ContentValues values, String selection, String[] selectionArgs) throws RemoteException; public ParcelFileDescriptor openFile(Uri url, String mode) throws RemoteException, FileNotFoundException; public AssetFileDescriptor openAssetFile(Uri url, String mode) throws RemoteException, FileNotFoundException; public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws RemoteException, OperationApplicationException;
但是閱讀ContentProvider代碼時,會發現
public abstract boolean onCreate();public void onConfigurationChanged(Configuration newConfig);public void onLowMemory();
這幾個方法並不在IContentProvider中聲明,因此千萬注意它們在運行時並不是處在AndroidManifest.xml中聲明時的進程中。而是處在調用ContentProvider的應用的進程中的。
因此千萬不要在onCreate中添加你期望運行在ContentProvider的進程的代碼。