以MediaProvider为对象。
在该函数中首先声明实例化ContentResolver对象,通过context.getContentResolver获得
然后调用MediaStore.Images.Media.query()查询数据库。
进程:android.process.media
返回mContentResolver对象,该对象在ContextImpl.init()初始化
mContentResolver = new ApplicationContentResolver(this,mainThread)
说明contentResolver实际上是ApplicationContentResolver对象。该类是ContextImpl内部类。继承自ContentResolver
mainThread为ActivityThread对象。
MediaStore是多媒体开发中常用的类,专门针对Image,video,audio等不同多媒体信息。
Image.Media.query()直接调用cr.query()
首先通过uri.getAuthority()得到签名auth.然后传给acquireProvider(mContext,auth),该方法是抽象方法,在ApplicationContextResolver中实现。
直接调用ActivityThread.acquireProvider(context,name),activityThread为应用程序的主线程,每一个应用进程只有一个ActivityThread。
先调用getProvider得到IContentProvider对象
先判断是否已经存在,不存在则要想AMS查询,通过IAMS.getContentProvider()返回ContentProviderHolder对象,然后通过installProvider()获得。
mProvidersByName.get(name)获得ContentProviderRecord对象,服务器端代表MediaProvider的对象。通过客户端传递过来的uri.getAuthority()得到cr的名称。
判断MediaProvider能否运行在客户端进程中,如果不能运行,创建新进程并且与客户端进程绑定。MediaProvider不能运行在客户端进程。
由此可知,getContentProviderImpl的作用就是等待MediaProvider创建完成,且在进程中运行---发布目标contentprovider进程,在AMS中分析中可知创建完进程以后,AMS会调用attachApplication()方法,里面通过调用attachApplicationLocked().将applicationthread与processRecord绑定。然后再将Provider也和processRecord也绑定。
安装该provider.
installProvider()获得IContentProvider对象。AMS.publicContentProviders()发布该provider.
客户端程序从getContentProvider()返回得到了ContentProviderHolder对象,从而回到了ActivityThread类中。客户端已经从AMS中得到了和目标进程直接通信的IContentProvider Bp对象。可以直接向目标进程发起请求,然后调用installProvider()