原文:
http://www.eoeandroid.com/thread-1049-1-1.html
在实际开发中,使用Content Provider(简称CP)有以下两种方式:
1
)和应用在一个APK包里
这种情况下和应用在同一进程中。process name和uid都一样。
2
)单独在一个APK包里。
这种情况下,如果在AndroidManifest.xml文件里声明了和某个进程同属一个进程,如:
<p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"></p><div><span style="line-height: 25px; color: rgb(0, 0, 136);"><manifest</span><span style="line-height: 25px;"> </span><span style="line-height: 25px; color: rgb(102, 0, 102);">xmlns:android</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"http://schemas.android.com/apk/res/android"</span><span style="line-height: 25px;"> </span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">package</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"com.android.providers.telephony"</span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:sharedUserId</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"android.uid.phone"</span></div><div><span style="line-height: 25px; color: rgb(0, 0, 136);">></span></div><div><span style="line-height: 25px; color: rgb(0, 0, 136);"><application</span><span style="line-height: 25px;"> </span><span style="line-height: 25px; color: rgb(102, 0, 102);">android:process</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"com.android.phone"</span><span style="line-height: 25px;"> </span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:allowClearUserData</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"false"</span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:label</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"Dialer Storage"</span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:icon</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"@drawable/ic_launcher_phone"</span><span style="line-height: 25px; color: rgb(0, 0, 136);">></span></div><div><span style="line-height: 25px; color: rgb(0, 0, 136);"><provider</span><span style="line-height: 25px;"> </span><span style="line-height: 25px; color: rgb(102, 0, 102);">android:name</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"TelephonyProvider"</span><span style="line-height: 25px;"> </span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:authorities</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"telephony"</span><span style="line-height: 25px;"> </span></div><div><span style="line-height: 25px; color: rgb(102, 0, 102);">android:multiprocess</span><span style="line-height: 25px; color: rgb(102, 102, 0);">=</span><span style="line-height: 25px; color: rgb(0, 136, 0);">"true"</span><span style="line-height: 25px;"> </span><span style="line-height: 25px; color: rgb(0, 0, 136);">/></span></div><p style="margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px;"></p>
这个里面通过
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机制进行调用。