### 二、Android中的多進程模式
#### 1、開啟多進程模式
正常情況下,Android中多進程是指一個應用中存在多個進程的情況。在Android中使用多進程只有一種方法:就是給四大組件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定android:process屬性。這個屬性的值就是進程名。這意味著不能在運行時指定一個線程所在的進程。(其實還有一種方式,就是使用JNI在Native層去fork一個新的進程,這中方法屬于特殊情況,也不是常用的創建多進程的方式)
關于進程的詳細描述可參考[深入了解Android系統之進程](http://www.hmoore.net/alex_wsc/androidsystem/403689)和[Android進程和線程](http://www.hmoore.net/alex_wsc/android/431889)
可以在Eclipse的DDMS視圖中查看進程信息,還可以用shell來查看當前所存在的進程信息,命令為:adb shell ps 或者 adb shell ps|grep 包名。
~~~
<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:launchMode="standard" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process=":remote" />
<activity
android:name=".ThirdActivity"
android:configChanges="screenLayout"
android:label="@string/app_name"
android:process="com.ryg.chapter_2.remote" />
~~~
上面的代碼中,
(1)MainActivity沒有指定process屬性,所以它運行在默認的進程中,默認進程的進程名是包名。
(2)SecondActivity會運行在一個單獨的進程中,進程名為“com.ryg.chapter_2:remote”,其中com.ryg.chapter_2是包名。在程序中的冒號“:”的含義是指要在當前的進程名前面附加上當前的包名,是一種簡寫的方法。而且以“:”開頭的進程屬于當前應用的私有進程,其他應用的組件不可以和它跑在同一個進程中。而進程名不以“:”開頭的進程屬于全局進程,其他應用通過ShareUID 方式可以和它跑在同一個進程中。
(3)ThirdActivity會運行在另一個單獨的進程中,進程名為“com.ryg.chapter_2.remote”。這是一種完整的命名方式。屬于全局進程,其他應用通過ShareUID方式可以和它跑在同一個進程中(需要這2個應用有相同的ShareUID且簽名相同才可以)。
>[info] **注意點一**:Android系統會為每一個應用分配一個唯一的UID,具有相同UID的應用才能共享數據。要求兩個應用具有相同的ShareUID并且簽名相同才可以跑在同一個進程中。在這種情況下,它們可以互相訪問對方的私有數據,比如data目錄、組件信息等,不管它們是否跑在同一個進程中。當然如果它們跑在同一個進程中,那么除了能共享data目錄、組件信息,還可以共享內存數據,或者說它們看起來就像是一個應用的兩個部分。
#### 2、多進程模式的運行機制
(1)多進程會帶來很多意想不到的麻煩,因為Android為每一個應用都分配了一個獨立的虛擬機,或者說為每個進程都分配了一個獨立的虛擬機,不同的虛擬機在內存分配上有不同的地址空間,這就導致在不同的虛擬機中訪問同一個類的對象會產生多份副本。這樣很就容易導致數據不同步。
(2)所有運行在不同進程的四大組件,只要它們之間需要通過內存來共享數據,都會共享失敗,這也是多進程所帶來的主要影響。正常情況下,四大組件中間不可能不通過一些中間層來共享數據,那么簡單的指定進程名來開啟多進程都會無法正確的運行。當然,特殊情況下,某些組件之間不需要共享數據,這個時候可以指定android:progress來開啟多進程,但是這種場景是不常見的,幾乎所有的情況都需要共享數據。
(3)使用多進程會造成主要以下四方面的問題:
* 靜態成員和單例模式完全失效。(由獨立虛擬機造成)
* 線程同步機制完全失效。(同上)
* SharedPreferences的可靠性下降。(存在并發讀寫的問題)
* Application會多次創建。(新的進程中又會導致進程所在的Application在新的虛擬機中再次創建)
(4)運行在同一個進程中的組件是屬于同一個虛擬機和同一個Application的,同理,運行在不同進程的組件是屬于兩個不同的虛擬機和Application的。
(5)多進程相當于兩個不同的應用采用了SharedUID的模式
(6)實現跨進程的方式有很多:
1. Intent傳遞數據。
2. 共享文件和SharedPreferences。
3. 基于Binder的Messenger和AIDL。
4. Socket等
- 前言
- 第一章Activity的生命周期和啟動模式
- 1.1 Activity生命周期全面分析
- 1.2 Activity的啟動模式
- 1.3 IntentFilter的匹配規則
- 第二章IPC
- 轉 chapter IPC
- 轉IPC1
- 轉IPC2
- Binder講解
- binder
- Messenger
- 一、Android IPC簡介
- 二、Android中的多進程模式
- 三、IPC基礎概念介紹
- 四、Android中的IPC方式
- 五、Binder連接池
- 第三章
- 第九章四大組件的工作過程
- 第十章
- 第13章 綜合技術
- 使用CrashHandler 來獲取應用的crash 信息
- 使用Multidex來解決方法數越界
- Android的動態加載技術