ContentProviders学习笔记

以MediaProvider为对象。


1.客户端函数:queryImage()


在该函数中首先声明实例化ContentResolver对象,通过context.getContentResolver获得

然后调用MediaStore.Images.Media.query()查询数据库。

进程:android.process.media


2.Context.getContentResolver()转ContextImpl.getContentResolver()


返回mContentResolver对象,该对象在ContextImpl.init()初始化


3.ContextImpl.init()


mContentResolver = new ApplicationContentResolver(this,mainThread)

说明contentResolver实际上是ApplicationContentResolver对象。该类是ContextImpl内部类。继承自ContentResolver

mainThread为ActivityThread对象。


4.MediaStore.Image.Media.query()


MediaStore是多媒体开发中常用的类,专门针对Image,video,audio等不同多媒体信息。

Image.Media.query()直接调用cr.query()


5.ContentProvider.query()

6.ContentProvider.acquireProvider(uri)


首先通过uri.getAuthority()得到签名auth.然后传给acquireProvider(mContext,auth),该方法是抽象方法,在ApplicationContextResolver中实现。


7.ContextImpl.ApplicationContentResolver.acquireProvider()


直接调用ActivityThread.acquireProvider(context,name),activityThread为应用程序的主线程,每一个应用进程只有一个ActivityThread。


8.ActivityThread.acquireProvider()


先调用getProvider得到IContentProvider对象


9.ActivityThread.getProvider()


先判断是否已经存在,不存在则要想AMS查询,通过IAMS.getContentProvider()返回ContentProviderHolder对象,然后通过installProvider()获得。


10.IActivityManagerService.getContentProvider()转ActivityManagerService.getContentProviderImpl()


mProvidersByName.get(name)获得ContentProviderRecord对象,服务器端代表MediaProvider的对象。通过客户端传递过来的uri.getAuthority()得到cr的名称。

判断MediaProvider能否运行在客户端进程中,如果不能运行,创建新进程并且与客户端进程绑定。MediaProvider不能运行在客户端进程。

由此可知,getContentProviderImpl的作用就是等待MediaProvider创建完成,且在进程中运行---发布目标contentprovider进程,在AMS中分析中可知创建完进程以后,AMS会调用attachApplication()方法,里面通过调用attachApplicationLocked().将applicationthread与processRecord绑定。然后再将Provider也和processRecord也绑定。


11.AMS.attachApplicationLocked()转ActivityThread.handlerBindApplication()


安装该provider.


12.ActivityThread.installContentProviders()


installProvider()获得IContentProvider对象。AMS.publicContentProviders()发布该provider.


客户端程序从getContentProvider()返回得到了ContentProviderHolder对象,从而回到了ActivityThread类中。客户端已经从AMS中得到了和目标进程直接通信的IContentProvider    Bp对象。可以直接向目标进程发起请求,然后调用installProvider()








你可能感兴趣的:(android,framework层)