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
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
相关文章推荐
- Content Provider(以下简称为CP)的加载
- ECMAScript 6(以下简称ES6)是JavaScript
- JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
- 在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?
- Android开发解决加载图片OOM问题(非常全面 兼顾4.0以下系统)(by 星空武哥)
- ECMAScript 6(以下简称ES6)是JavaScript
- CP是什么?Content Provider的简称
- Oracle GoldenGate (以下简称ogg)在异种移植os同一种db之间的数据同步。
- 对 IID 为“{00020970-0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。
- android6.0以下https加载不出来数据bug
- ECMAScript 6(以下简称ES6)是JavaScript
- VS一直显示“正在从以下位置***加载符号”的解决办法
- as3的swf不能加载含有as2.0脚本以下的swf文件吗?
- 文件中的类都不能进行设计,因此未能为该文件显示设计器。设计器检查出文件中有以下类: FormMain --- 未能加载基类“WinForm.Win.FormsBase.FormMainBase”。请确保已引用该程序集并已生成所有项目
- jQuery-懒加载技术(简称lazyload)
- ubuntu arm妙算加载cp210x驱动
- 无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:
- WKWebView9.0以下使用加载不出html
- 关于商业计划书(Business Project,以下简称BP)写作那些事儿(一)
- 爆出的法拉第未来(Faraday Future,以下简称“FF”)