一、ContentProvider的基本使用及原理
实现ContentProvider接口,并在AndroidManifest中注册它,设定特定URl。
创建ContentResolver对象,使用相应URI调用ContentProvider中的相应方法。
二、注册
在xml文件中声明
进程启动->Activitythread.main->ActivityThread.attach
AMS.attachApplication->AMS.attachApplicationLocked->AMS.generateApplicationProviderLocked
List<ProviderInfo> providers =
AppGlobals.getPackageManager().queryContentProviders(…).getList();
解析xml,获取所有Provider的信息
依次记录成ContentProviderRecord,
接着存入ProcessRecord.ArrayMap<String, ContentProviderRecord>
三、ContentResolver跨进程调用ContentProvider原理
调用方法举例getApplicationContext().getContentResolver().getType(url)
1.getApplicationContext().getContentResolver()返回一个ApplicationContentResolver类
继承自抽象类ContentResolver
ApplicationContentResolver在ContextImpl的私有构造器中初始化
2.getType(url)
IContentProvider provider = ContentResolver.acquireExistingProvider(url)->
ApplicationContentResolver.acquireProvider(context, url.authority)->
ActivityThread.acquireProvider(context, url.authority){
ActivityThread .acquireExistingProvider:从本地寻找符合的ProviderClientRecord
(IPC)AMS.getContentProvider从AMS获取到对应的IContentProvider代理对象
}
provider.getType(url)
provider是对应ContentProvider的代理,通过IPC执行ContentProvider.getType方法