1.13 ContentProvider机制

less than 1 minute read

ContentProvider使用

  // 1. 继承ContentProvider
  public class XXXContentProvider extends ContentProvider {
    public Uri insert(Uri uri, ContentValues values);
    public int delete(Uri uri, String selection, String[] selectionArgs);
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
    ...
  }

  // 2. 在AndroidManifest.xml注册
  <manifest>
    ...
      <application ...>
        <provider android:name=".XXXContentProvider" android:authorities="com.xxx.providers.xxxprovider" />
      </application>
    ...
  </manifest>

  // 3. 使用ContentProvider
  ContentProvider provider = getContentResolver();
  Uri uri = Uri.parse("content://com.xxx.providers..xxxprovider/person");
  ContentValues values = new ContentValues();
  values.put("name", "xxx");
  provider.insert(uri, values);


ContentProvider机制

  1. client进程: 向system_server请求对应的provider
  2. system进程: 如果目标provider未启动, system_Server调用startProcessLocked启动provider进程
  3. provider: 进程启动后attach到system_server, 紧接着bindApplication, 在这个过程会installProvider以及publishContentProviders, 再binder call到system_server进程
  4. system进程: 发布provider信息, 通过notify机制, 唤醒前面处于wait状态的binder线程, 并将getContentProvider()返回给client进程
  5. client进程: 执行installProvider操作, 安装providers的对象记录, 引用技术维护等工作