2.2 android中的多進程機制

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. 開啟多進程的其他問題

    1. 靜態成員和單例模式失效
      這個問題上面已經舉例說明了。
    1. 線程同步機制完全失效
      既然都不是同一塊內存,鎖對象和鎖全局都無法保證線程安全。
    1. SharedPreferences的可靠性下降
      多進程同時并發讀寫肯定會造成問題。
    1. 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,264評論 25 708
  • 什么是IPC?IPC是Inter-Process Communication的縮寫,含義為進程間通信或者跨進程之間...
    Simon_Zhang閱讀 557評論 0 0
  • 從來沒有像現在這樣有提筆的沖動,就像我從來不曾想到在醉酒的時候會讓我的孩子如此的擔驚受怕。 14年,一個兩倍于婚姻...
    風刀水寒閱讀 494評論 0 3
  • 挑戰 我曾經設計了一個移動APP的UI,里面集合各種有關UI設計作品的風格、主題,有各種高逼格的圖片,提供給特定的...
    Nicebook閱讀 4,989評論 0 25