本文內(nèi)容基于《Android開發(fā)藝術(shù)探索》,強烈推薦,值得一看。
在Android中說多進程一般是指一個應(yīng)用中存在多個進程烧栋,在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:設(shè)置android:process=":remote"砸琅,系統(tǒng)會為它創(chuàng)建一個單獨的進程宋距,進程名為包名+:remote,即com.zhong:remote症脂,相當于android:process="com.zhong:remote";
- ActivityC:設(shè)置android:process="com.zhong.remote",系統(tǒng)會為它創(chuàng)建一個單獨的進程谚赎,進程名為process設(shè)置的值,即com.zhong.remote
2). ":remote"和"com.zhong.remote"區(qū)別
":remote"中":"是指要在當前進程名前面附近包名的簡寫诱篷,"com.zhong.remote"是一種完整的寫法壶唤,進程名不會再附加包名;其次棕所,":"是屬于當前應(yīng)用的私有進程闸盔,"com.zhong.remote"是全局進程,全局進程其他應(yīng)用可以通過ShareUID方式跑在同一進程中(前提是兩個應(yīng)用ShareUID相同并且簽名相同)琳省,這兩個應(yīng)用可以相互訪問對方私有數(shù)據(jù)迎吵。
2.運行機制
由于Android為每個進程分配獨立的虛擬機,所以不同虛擬機訪問同一個類會產(chǎn)生不同的副本针贬,因此運行在不同進程中的組件無法通過內(nèi)存共享數(shù)據(jù)击费,所以一個應(yīng)用使用多進程會出現(xiàn)一下幾個問題:
- 靜態(tài)成員和單例模式完全失效(不是同一塊內(nèi)存,會產(chǎn)生不同的副本)
- 線程同步機制完全失效(不是同一塊內(nèi)存桦他,所以對象也不是同一個蔫巩,因此類鎖、對象鎖也不是同一個,不能保證線程同步)
- SharedPreferences 可靠性下降(SharedPreferences不支持多個進程同時寫批幌,會有一定的幾率丟失數(shù)據(jù))
- Application 多次創(chuàng)建(Android為每個進程分配獨立的虛擬機础锐,這個過程其實就是啟動一個應(yīng)用,所以Application會被創(chuàng)建多次)
小結(jié): Android中使用多進程一般是來分擔主進程的內(nèi)存壓力荧缘,應(yīng)用越做越大皆警,需要的內(nèi)存也越來越多,講一些獨立的組件放在不同的進程中截粗,這樣可以減輕主進程的內(nèi)存負擔信姓;還有就是啟動一個Service,做一些守護或者耗時的操作绸罗。
本來想寫一下Binder機制的意推,但現(xiàn)在自己還沒完全搞懂,以后補上下面幾篇文章會寫一下IPC方式:Messenger珊蟀、AIDL菊值、ContentProvider以及Binder連接池的使用,至于文件育灸、Socket我感覺不適很常用就不再做說明了
本人技術(shù)有限腻窒,歡迎指正,謝謝磅崭!