Content Provider加载原理

在实际开发中,使用Content Provider(简称CP)有以下两种方式:
1 )和应用在一个APK包里
这种情况下和应用在同一进程中。process name和uid都一样。
2 )单独在一个APK包里。
这种情况下,如果在AndroidManifest.xml文件里声明了和某个进程同属一个进程,如:

<manifest xmlns:android = "http://schemas.android.com/apk/res/android"   
package = "com.android.providers.telephony"
android:sharedUserId = "android.uid.phone"
>
<application android:process = "com.android.phone"  
android:allowClearUserData = "false"
android:label = "Dialer Storage"
android:icon = "@drawable/ic_launcher_phone" >
<provider android:name = "TelephonyProvider"  
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时,先需要获取该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机制进行调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值