您的位置:首页 > 其它

Content Provider(以下简称为CP)的加载

2012-03-15 18:03 309 查看
在实际开发中,CP有以下两种用法:

1)和应用在一个APK包里

这种情况下和应用在同一进程中。process name和uid都一样。

2)单独在一个APK包里。

这种情况下,如果在AndroidManifest.xml文件里声明了和某个进程同属一个进程,如:

package="com.android.providers.telephony"

android:sharedUserId="android.uid.phone"

>

android:allowClearUserData="false"

android:label="Dialer Storage"

android:icon="@drawable/ic_launcher_phone">

android:authorities="telephony"

android:multiprocess="true" />

这个里面通过android:sharedUserId="android.uid.phone"和android:process="com.android.phone"声明了该CP是和phone进程同属一个进程,拥有同样的process name和uid.

如果没有上述声明,那么该CP是在独立的进程中,拥有属于自己的process name和uid.

以上两种用法可以总结为:

1)CP和某个进程同属一个进程

这种情况下,当该进程启动时,会搜索属于该进程的所有CP,并加载。

2)CP属于独立的一个进程。

这种情况下,只有需要用到该CP时,才会去加载。

那么,当一个进程想要操作一个CP时,先需要获取该CP的对象,系统是如何处理呢:

1)如果该CP属于当前主叫进程,因为在进程启动时就已经加载过了,所以系统会直接返回该CP的对象。

2)如果该CP不属于当前主叫进程,那么系统会进行相关处理(由ActivityManagerService进行,以下简称为AMS):

所有已加载的CP信息都已保存在AMS中。当需要获取某个CP的对象时,AMS会先判断该CP是否已被加载

----如果已被加载,该CP和当前主叫进程不属一个进程,但是该CP设置了multiprocess的属性(如上例中的android:multiprocess="true"),并且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。否则就需要通过IPC机制进行调用。

----如果还未被加载,该CP和当前主叫进程不属一个进程,但是该CP设置了multiprocess的属性(如上例中的android:multiprocess="true"),并且该CP属于系统级CP,那么就在当前主叫进程内部新生成该CP的对象。否则就需要先创建该CP所在的进程,然后再通过IPC机制进行调用。

本文转载至: http://www.eoeandroid.com/thread-1049-1-7.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  开发 package
相关文章推荐