Android中多進程的應用其實是單個apk中運用多個進程的概念,那我們?nèi)绾问褂枚噙M程呢?
要想知道如何使用多進程,首先我們得了解Android中多進程的概念。一般情況下,一個應用程序就一個進程,這個進程的名稱就是應用程序包名。我們知道進程是系統(tǒng)分配資源和調(diào)度的基本單位,所以每個進程都有自己獨立的資源和內(nèi)存空間,別的進程是不能任意訪問其他進程的內(nèi)存和資源的。那如何讓自己的應用擁有多個進程?
很簡單,我們的四大組件在AndroidManifest文件中注冊的時候,有個屬性是android:process,這里可以指定組件的所處的進程。默認就是應用的主進程。指定為別的進程之后,系統(tǒng)在啟動這個組件的時候,就先創(chuàng)建(如果還沒創(chuàng)建的話)這個進程,然后再創(chuàng)建該組件。你可以重載Application類的onCreate方法,打印出它的進程名稱,就可以清楚的看見了。再設置android:process屬性時候,有個地方需要注意:如果是android:process=":deamon",以:開頭的名字,則表示這是一個應用程序的私有進程,否則它是一個全局進程。私有進程的進程名稱是會在冒號前自動加上包名,而全局進程則不會。一般我們都是有私有進程,很少使用全局進程。
那么使用多進程有什么好處和壞處呢?下面我們來分析下。
好處:1、分擔主進程的內(nèi)存壓力。我們的應用越做越大,內(nèi)存越來越多,將一些獨立的組件放到不同的進程,它就不占用主進程的內(nèi)存空間了。比如在啟動一個不可見的輕量級私有進程,在后臺收發(fā)消息,或者做一些耗時的事情,或者開機啟動這個進程等。
? ? ? ? ? 2、防止主進程被殺守護進程,守護進程和主進程之間相互監(jiān)視,有一方被殺就重新啟動它。
壞處:1、多占了系統(tǒng)的內(nèi)存空間,很容易沾滿而導致卡頓,同時也消耗用戶的電量。同時在啟動單獨進程時,進程的創(chuàng)建會影響繼承Application的實例,onCreate()會再次執(zhí)行一遍。
? ? ? ? ? 2、不同進程之間內(nèi)存不能共享,最大的弊端是他們之間通信麻煩,不能將公用數(shù)據(jù)放在Application中,堆棧信息、文件操作也是獨立的,如果他們之間傳遞的數(shù)據(jù)不大并且是可序列化的,可以考慮通過Bundle傳遞, 如果數(shù)據(jù)量較大,則需要通過AIDL或者文件操作來實現(xiàn)。
關于android中多進程的使用最常見的例子是Service,針對Service的使用我們應注意以下情況:
1、應用中有Activity部分有會使用較多的UI,占用較多的內(nèi)存資源,并且要求Activity退到后臺情況下要求Service在后臺運行。因為Android本身有Low Memory Killer這套機制,在系統(tǒng)內(nèi)存吃緊的情況下會去會砍掉內(nèi)存占用較多(一般是OOM_ADJ值較大的Process),此時因為有Service在后臺運行,所以會降低OOM_ADJ,Low Memory Killer在砍Process的時候就不容易將此部分內(nèi)存回收。此時可以考慮將Service從應用進程中分離出來,這樣Low Memory Killer在回收內(nèi)存時會將因為Activity部分占用的內(nèi)存較大,? OOM_ADJ較大,優(yōu)先將其砍掉釋放內(nèi)存,同時保證Service正常運行。
2、在系統(tǒng)中有很多有共性的Service,同時應用中Activity顯示部分的UI不多或者沒有Activity.可以將這些Service合并成同一個進程。因為android每次啟動一個進程,在zygote fork階段會預載于一部分資源占用內(nèi)存(具體幾M記不清楚了),通過將Service合并,可以節(jié)省這部分開銷。