大家好,欢迎来到IT知识分享网。
一、ContentProvider所在应用的启动时机
ContentProvider可向多个进程提供数据,比如ContentProvider实现在应用A中,A的进程尚未启动,另一个应用(进程)B在使用ContentProvider时就会启动应用A。
在调用ContentResolver的query时,会先获取A中ContentProvider在进程B中的binder代理IContentProvider。



cpr是ContentProviderRecord类型,像ActivityRecord、ServiceRecord、BroadcastRecord一样,ContentProviderRecord是ContentProvider在AMS里的记录,里面包含了客户端到Provider的连接等信息。



二、ContentProvider自身启动的时机
应用在启动时,它里面的ContentProvider也会立即被启动,即便这时还没有任何代码会用到ContentProvider,ContentProvider的构造函数和onCreate也会被调用。
在应用启动的入口ActivityThread的main函数中会调attach把客户端的Application交由AMS管理,最终会调到AMS内部的attachApplicationLocked。






三、ContentProvider不自启动
在AndroidManifest.xml中使用android:process和android:multiprocess这两个属性来描述provider可以让ContentProvider不随Application的初始化而启动。我们知道默认不指定android:process的话,组件所在的进程名就是包名,multiprocess默认为false。如果对provider指定android:process=”fore”,同时android:multiprocess=”true”,那么在应用启动时provider就不会随之启动,并且provider并没有在另一个新进程中,仍然在原来应用默认的进程中。只有在后面用到provider时,比如query、insert等调用才会启动provider。
我们仔细看一下之前所述的ContentProvider随应用启动的流程。
1. AMS里的attachApplicationLocked
应用启动时,ActivityThread的attach函数最终会调到AMS里的attachApplicationLocked,在它往回调用ActivityThread的bindApplication之前,先会准备好应用中包含的所有provider的list,这是通过函数generateApplicationProvidersLocked实现的。

2. PMS里的queryContentProviders




从第二部分的分析可知,后面在ActivityThread中会依次遍历由AMS传来的provider列表,调用installProvider,通过反射newInstance出每个ContentProvider,并调用它们的onCreate。这里因为指定了不同的android:processName,所以不会被加到列表传给ActivityThread,也就不会被启动。

那么指定了android:multiprocess=”true”后,为什么ContentProvider没有在单独的另一个进程中运行呢?前面说了ContentProvider如果不在应用初始化时一起启动,那就在被使用时才启动。调用query、insert等ContentResolver的方法时,客户端会调acquireUnstableProvider之类的函数,在AMS端对应调用getContentProviderImpl。
第一部分有分析这个过程,如果ContentProvider实现在应用A中,那么在B中使用provider时,在getContentProviderImpl里会调startProcessLocked来启动应用A所在的进程,但在startProcessLocked之前会先判断是否在同一进程中启动provider就可以了,不用再把provider放在另一个进程中。本来ContentProvider可以分别给位于不同进程的不同客户端提供数据,但如果不是必要的话,ContentProvider在同一进程内部被调用会更节省资源,所以在getContentProviderImpl时有做判断,这个判断就是ContentProviderRecord里的canRunHere函数。下面的代码是在getContentProviderImpl中判断如果canRunHere返回true,就直接返回ContentProviderHolder,不继续往下走去startProcessLocked起新进程了。


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/58097.html
