Android中多進(jìn)程的應(yīng)用其實(shí)是單個(gè)apk中運(yùn)用多個(gè)進(jìn)程的概念垢村,那我們?nèi)绾问褂枚噙M(jìn)程呢割疾?
要想知道如何使用多進(jìn)程,首先我們得了解Android中多進(jìn)程的概念嘉栓。一般情況下宏榕,一個(gè)應(yīng)用程序就一個(gè)進(jìn)程,這個(gè)進(jìn)程的名稱就是應(yīng)用程序包名侵佃。我們知道進(jìn)程是系統(tǒng)分配資源和調(diào)度的基本單位麻昼,所以每個(gè)進(jìn)程都有自己獨(dú)立的資源和內(nèi)存空間,別的進(jìn)程是不能任意訪問(wèn)其他進(jìn)程的內(nèi)存和資源的趣钱。那如何讓自己的應(yīng)用擁有多個(gè)進(jìn)程涌献?
很簡(jiǎn)單,我們的四大組件在AndroidManifest文件中注冊(cè)的時(shí)候首有,有個(gè)屬性是android:process燕垃,這里可以指定組件的所處的進(jìn)程。默認(rèn)就是應(yīng)用的主進(jìn)程井联。指定為別的進(jìn)程之后卜壕,系統(tǒng)在啟動(dòng)這個(gè)組件的時(shí)候,就先創(chuàng)建(如果還沒(méi)創(chuàng)建的話)這個(gè)進(jìn)程烙常,然后再創(chuàng)建該組件轴捎。你可以重載Application類的onCreate方法,打印出它的進(jìn)程名稱蚕脏,就可以清楚的看見(jiàn)了侦副。再設(shè)置android:process屬性時(shí)候,有個(gè)地方需要注意:如果是android:process=":deamon"驼鞭,以:開頭的名字秦驯,則表示這是一個(gè)應(yīng)用程序的私有進(jìn)程,否則它是一個(gè)全局進(jìn)程挣棕。私有進(jìn)程的進(jìn)程名稱是會(huì)在冒號(hào)前自動(dòng)加上包名译隘,而全局進(jìn)程則不會(huì)。一般我們都是有私有進(jìn)程洛心,很少使用全局進(jìn)程固耘。
那么使用多進(jìn)程有什么好處和壞處呢?下面我們來(lái)分析下词身。
好處:1厅目、分擔(dān)主進(jìn)程的內(nèi)存壓力。我們的應(yīng)用越做越大,內(nèi)存越來(lái)越多损敷,將一些獨(dú)立的組件放到不同的進(jìn)程户辫,它就不占用主進(jìn)程的內(nèi)存空間了。比如在啟動(dòng)一個(gè)不可見(jiàn)的輕量級(jí)私有進(jìn)程嗤锉,在后臺(tái)收發(fā)消息,或者做一些耗時(shí)的事情墓塌,或者開機(jī)啟動(dòng)這個(gè)進(jìn)程等瘟忱。
? ? ? ? ? 2、防止主進(jìn)程被殺守護(hù)進(jìn)程苫幢,守護(hù)進(jìn)程和主進(jìn)程之間相互監(jiān)視访诱,有一方被殺就重新啟動(dòng)它。
壞處:1韩肝、多占了系統(tǒng)的內(nèi)存空間触菜,很容易沾滿而導(dǎo)致卡頓,同時(shí)也消耗用戶的電量哀峻。同時(shí)在啟動(dòng)單獨(dú)進(jìn)程時(shí)涡相,進(jìn)程的創(chuàng)建會(huì)影響繼承Application的實(shí)例,onCreate()會(huì)再次執(zhí)行一遍剩蟀。
? ? ? ? ? 2催蝗、不同進(jìn)程之間內(nèi)存不能共享,最大的弊端是他們之間通信麻煩育特,不能將公用數(shù)據(jù)放在Application中丙号,堆棧信息、文件操作也是獨(dú)立的缰冤,如果他們之間傳遞的數(shù)據(jù)不大并且是可序列化的犬缨,可以考慮通過(guò)Bundle傳遞, 如果數(shù)據(jù)量較大棉浸,則需要通過(guò)AIDL或者文件操作來(lái)實(shí)現(xiàn)怀薛。
關(guān)于android中多進(jìn)程的使用最常見(jiàn)的例子是Service,針對(duì)Service的使用我們應(yīng)注意以下情況:
1涮拗、應(yīng)用中有Activity部分有會(huì)使用較多的UI乾戏,占用較多的內(nèi)存資源,并且要求Activity退到后臺(tái)情況下要求Service在后臺(tái)運(yùn)行三热。因?yàn)锳ndroid本身有Low Memory Killer這套機(jī)制鼓择,在系統(tǒng)內(nèi)存吃緊的情況下會(huì)去會(huì)砍掉內(nèi)存占用較多(一般是OOM_ADJ值較大的Process),此時(shí)因?yàn)橛蠸ervice在后臺(tái)運(yùn)行,所以會(huì)降低OOM_ADJ,Low Memory Killer在砍Process的時(shí)候就不容易將此部分內(nèi)存回收就漾。此時(shí)可以考慮將Service從應(yīng)用進(jìn)程中分離出來(lái)呐能,這樣Low Memory Killer在回收內(nèi)存時(shí)會(huì)將因?yàn)锳ctivity部分占用的內(nèi)存較大,? OOM_ADJ較大,優(yōu)先將其砍掉釋放內(nèi)存摆出,同時(shí)保證Service正常運(yùn)行朗徊。
2、在系統(tǒng)中有很多有共性的Service偎漫,同時(shí)應(yīng)用中Activity顯示部分的UI不多或者沒(méi)有Activity.可以將這些Service合并成同一個(gè)進(jìn)程爷恳。因?yàn)閍ndroid每次啟動(dòng)一個(gè)進(jìn)程,在zygote fork階段會(huì)預(yù)載于一部分資源占用內(nèi)存(具體幾M記不清楚了)象踊,通過(guò)將Service合并温亲,可以節(jié)省這部分開銷。