本文內容基于《Android開發藝術探索》,強烈推薦,值得一看。
在Android中說多進程一般是指一個應用中存在多個進程,在Android中使用多進程只有一種方法:給四大組件在AndroidMenifest中指定android:process屬性,除此之外別無他法(通過JNI在native層去fork一個進程也可以,不常用,不做介紹),所以我們不能給一個線程或者實體類指定其運行時所在的進程。
1.開啟多進程
<activity
android:name="com.zhong.ActivityA" />
<activity
android:name="com.zhong.ActivityB"
android:process=":remote" />
<activity
android:name="com.zhong.ActivityC"
android:process="com.zhong.remote" />
1). 上面三個Activity中:
- ActivityA:未指明android:process屬性,它允許在默認進程中,進程名為包名,即com.zhong;
- ActivityB:設置android:process=":remote",系統會為它創建一個單獨的進程,進程名為包名+:remote,即com.zhong:remote,相當于android:process="com.zhong:remote";
- ActivityC:設置android:process="com.zhong.remote",系統會為它創建一個單獨的進程,進程名為process設置的值,即com.zhong.remote
2). ":remote"和"com.zhong.remote"區別
":remote"中":"是指要在當前進程名前面附近包名的簡寫,"com.zhong.remote"是一種完整的寫法,進程名不會再附加包名;其次,":"是屬于當前應用的私有進程,"com.zhong.remote"是全局進程,全局進程其他應用可以通過ShareUID方式跑在同一進程中(前提是兩個應用ShareUID相同并且簽名相同),這兩個應用可以相互訪問對方私有數據。
2.運行機制
由于Android為每個進程分配獨立的虛擬機,所以不同虛擬機訪問同一個類會產生不同的副本,因此運行在不同進程中的組件無法通過內存共享數據,所以一個應用使用多進程會出現一下幾個問題:
- 靜態成員和單例模式完全失效(不是同一塊內存,會產生不同的副本)
- 線程同步機制完全失效(不是同一塊內存,所以對象也不是同一個,因此類鎖、對象鎖也不是同一個,不能保證線程同步)
- SharedPreferences 可靠性下降(SharedPreferences不支持多個進程同時寫,會有一定的幾率丟失數據)
- Application 多次創建(Android為每個進程分配獨立的虛擬機,這個過程其實就是啟動一個應用,所以Application會被創建多次)
小結: Android中使用多進程一般是來分擔主進程的內存壓力,應用越做越大,需要的內存也越來越多,講一些獨立的組件放在不同的進程中,這樣可以減輕主進程的內存負擔;還有就是啟動一個Service,做一些守護或者耗時的操作。
本來想寫一下Binder機制的,但現在自己還沒完全搞懂,以后補上下面幾篇文章會寫一下IPC方式:Messenger、AIDL、ContentProvider以及Binder連接池的使用,至于文件、Socket我感覺不適很常用就不再做說明了
本人技術有限,歡迎指正,謝謝!