1. 在android中創建多進程
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="._2activity.SecondActivity"
android:process=":remote" />
<activity
android:name="._2activity.ThirdActivity"
android:process="qingfengmy.developmentofart.remote"></activity>
然后在mainActivity中啟動SecondActivity,在SecondActivity中啟動ThirdActivity。
cmd中敲命令查看當前進程如下:
127|root@vbox86p:/ # ps | grep qingfengmy
u0_a61 1721 97 1004236 54184 ffffffff b76faf75 S qingfengmy.developmentofart
u0_a61 1754 97 1004236 53908 ffffffff b76faf75 S qingfengmy.developmentofart:remote
u0_a61 1786 97 1007356 54200 ffffffff b76faf75 S qingfengmy.developmentofart.remote
可以看到有三個進程。默認進程qingfengmy.developmentofart。兩個新進程qingfengmy.developmentofart:remote和qingfengmy.developmentofart.remote。
其中,以":"開頭的進程表示當前應用的私有進程,其他應用組件不可以和它跑在同一進程中,而進程名不以":"開頭的進程屬于全局進程,其他應用通過shareUID方式可以和它跑在同一進程中。
擴展:android系統會為每一個應用分配一個唯一的UID,具有相同UID的應用才能共享數據,而且兩個應用的簽名相同才可以。這種情況下,他們可以互相訪問對方私有數據,如data目錄,組件信息等。
再看棧內情況(使用adb shell dumpsys activity):
Running activities (most recent first):
TaskRecord{2dda218f #179 A=qingfengmy.developmentofart U=0 sz=3}
Run #2: ActivityRecord{2bfdd409 u0 qingfengmy.developmentofart/._2activi
ty.ThirdActivity t179}
Run #1: ActivityRecord{150eaa0c u0 qingfengmy.developmentofart/._2activi
ty.SecondActivity t179}
Run #0: ActivityRecord{2dcd1047 u0 qingfengmy.developmentofart/.MainActi
vity t179}
可見雖然不在一個進程,但還是在一個任務棧中。
2. 開啟多進程后的問題
項目中新建一個數據類
public class UserManager {
public static int sUserId = 1;
}
MainActivity中設置sUserId=2
UserManager.sUserId = 2;
SecondActivity中打印sUserId的值
Log.e("aaa","sUserId="+UserManager.sUserId);
打印結果是1.為什么呢?
android為每一個應用都分配了一個獨立的虛擬機,或者說為每一個進程都分配了一個虛擬機。不同的虛擬機在內存分配上有不同的地址空間。這就導致了不同的虛擬機中訪問同一個類的對象會產生多份副本。如上面的例子,兩個進程的虛擬機中都有一個UserManager類,修改當前UserManager類只會對當前進程產生影響,不影響其他進程中的userManager。從而導致上面的問題。
3. 開啟多進程的其他問題
- 靜態成員和單例模式失效
這個問題上面已經舉例說明了。
- 靜態成員和單例模式失效
- 線程同步機制完全失效
既然都不是同一塊內存,鎖對象和鎖全局都無法保證線程安全。
- 線程同步機制完全失效
- SharedPreferences的可靠性下降
多進程同時并發讀寫肯定會造成問題。
- SharedPreferences的可靠性下降
- Application會多次創建
當一個組件跑在一個新的進程中時,由于系統要創建新的進程同時分配獨立的虛擬機,所以這個過程其實是啟動一個應用的過程,既然重新啟動應用,肯定會創建新的Application。
- Application會多次創建
實例如下:Applicaion的onCreate中打印當前進程的名稱。
@Override
public void onCreate() {
super.onCreate();
String processName = getCurProcessName(this);
Log.e("aaa",processName);
}
String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
結果:可見onCreate執行了三次。
06-14 22:03:25.787 27760-27760/qingfengmy.developmentofart E/aaa: qingfengmy.developmentofart
06-14 22:03:26.038 27782-27782/? E/aaa: qingfengmy.developmentofart:remote
06-14 22:03:26.418 27814-27814/? E/aaa: qingfengmy.developmentofart.remote