一般情況下,一個apk啟動后只會運(yùn)行在一個進(jìn)程中梯皿,其進(jìn)程名為AndroidManifest.xml
文件中指定的應(yīng)用包名暑诸,所有的基本組件都會在這個進(jìn)程中運(yùn)行。但是如果需要將某些組件(如Service峰搪、Activity等)運(yùn)行在單獨(dú)的進(jìn)程中岔冀,就需要用到Android:process屬性了。我們可以為Android的基礎(chǔ)組件指定process屬性來指定它們運(yùn)行在指定進(jìn)程中概耻。
實(shí)現(xiàn)方法
都是在AndroidManifest.xml
中設(shè)置process
實(shí)現(xiàn)使套,也有兩種形式
- 第一種形式如 android:process=":remote"罐呼,以冒號開頭,冒號后面的字符串原則上是可以隨意指定的侦高。如果我們的包名為“com.example.processtest”嫉柴,則實(shí)際的進(jìn)程名為“com.example.processtest:remote”。這種設(shè)置形式表示該進(jìn)程為當(dāng)前應(yīng)用的私有進(jìn)程奉呛,其他應(yīng)用的組件不可以和它跑在同一個進(jìn)程中差凹。
- 第二種情況如android:process="com.example.processtest.remote",以小寫字母開頭侧馅,表示運(yùn)行在一個以這個名字命名的全局進(jìn)程中,其他應(yīng)用通過設(shè)置相同的ShareUID可以和它跑在同一個進(jìn)程呐萌。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.processtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:name="com.example.processtest.MyApplication"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity
android:name=".ProcessTestActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".ProcessTestService"
android:process=":remote">
</service>
</application>
</manifest>
潛在問題
開啟多進(jìn)程很簡單馁痴,但是這樣卻存在很多問題
- 多進(jìn)程間內(nèi)存不可見
- Application被多次執(zhí)行
- 靜態(tài)成員的失效
- 文件共享問題
- 斷電調(diào)試問題
總結(jié)
其實(shí),Android實(shí)現(xiàn)應(yīng)用內(nèi)多進(jìn)程并不是簡單的設(shè)置屬性process就可以了肺孤,而是會產(chǎn)生很多特殊的問題罗晕。像前面提到的,Android啟動多進(jìn)程模式后赠堵,不僅靜態(tài)變量會失效小渊,而且類似的如同步鎖機(jī)制、單例模式也會存在同樣的問題茫叭。這就需要我們在使用的時候多加注意酬屉。而且設(shè)置多進(jìn)程之后,各個進(jìn)程間就無法直接相互訪問數(shù)據(jù)揍愁,只能通過AIDL等進(jìn)程間通信方式來交換數(shù)據(jù)呐萨。