在实际开发中,使用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机制进行调用。

更多相关文章

  1. Activity与Service是否处于同一进程? Service 的两大功能是什么?
  2. 2012年总结
  3. [置顶] android Listview分批加载+自动加载(改进版)(附源码下载)
  4. Android(安卓)Binder设计与实现 - 设计篇
  5. AndroidQuery 开源项目
  6. WebView简介(加速加载篇)
  7. Android资源管理中的Runtime Resources Overlay-------之overlay
  8. android开发AIDL实例
  9. Android进程间通信机制——基础篇

随机推荐

  1. Android(安卓)上传文件[转]
  2. android图片拖动
  3. android获取3G或wifi流量信息
  4. 2013.12.03(6) ——— android ActionbarSh
  5. 攔截Android的SMS並且停止轉發
  6. Android处理线程暂停与恢复
  7. Android如何监听输入框的出现和隐藏
  8. android中异步加载图片信息
  9. android 自带 xml解析
  10. Android(安卓)Menu(Context Menu,Options