Android一個(gè)重要并且特殊的特性就是,一個(gè)應(yīng)用的進(jìn)程的生命周期不是由應(yīng)用自身直接控制的,而是由系統(tǒng),根據(jù)運(yùn)行中的應(yīng)用的一些特征來(lái)決定的,包括:這些應(yīng)用對(duì)用戶(hù)的重要性、系統(tǒng)的全部可用內(nèi)存。
對(duì)于應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),理解不同的應(yīng)用組件(特別是Activity、Service、Intent Receiver)對(duì)應(yīng)用進(jìn)程的生命周期的影響,這是非常重要的。如果沒(méi)有正確地使用這些組件,將會(huì)導(dǎo)致當(dāng)應(yīng)用正在處理重要的工作時(shí),進(jìn)程卻被系統(tǒng)消毀的后果。
對(duì)于進(jìn)程生命周期,一個(gè)普遍的錯(cuò)誤就是:當(dāng)一個(gè)Intent Receiver在它的onReceiveIntent()方法中,接收到一個(gè)intent后,就會(huì)從這個(gè)方法中返回。而一旦從這個(gè)方法返回后,系統(tǒng)將會(huì)認(rèn)為這個(gè)Intent Receiver不再處于活動(dòng)狀態(tài)了,也就會(huì)認(rèn)為它的宿主進(jìn)程不需要了(除非宿主進(jìn)程中還存在其它的應(yīng)用組件)。從而,系統(tǒng)隨時(shí)都會(huì)消毀這個(gè)進(jìn)程,收回內(nèi)存,并中止其中還在運(yùn)行的子線程。問(wèn)題的解決辦法就是,在IntentReceiver中,啟動(dòng)一個(gè)Service,這樣系統(tǒng)就會(huì)知道在這個(gè)進(jìn)程中,還有活動(dòng)的工作正在執(zhí)行。
為了決定在內(nèi)存不足情況下消毀哪個(gè)進(jìn)程,Android會(huì)根據(jù)這些進(jìn)程內(nèi)運(yùn)行的組件及這些組件的狀態(tài),把這些進(jìn)程劃分出一個(gè)“重要性層次”。這個(gè)層次按順序如下:
1、前端進(jìn)程是擁有一個(gè)顯示在屏幕最前端并與使用者做交互的Activity(它的onResume已被調(diào)用)的進(jìn)程,也可能是一個(gè)擁有正在運(yùn)行的IntentReceiver(它的onReceiveIntent()方法正在運(yùn)行)的進(jìn)程。在系統(tǒng)中,這種進(jìn)程是很少的,只有當(dāng)內(nèi)存低到不足于支持這些進(jìn)程的繼續(xù)運(yùn)行,才會(huì)將這些進(jìn)程消毀。通常這時(shí)候,設(shè)備已經(jīng)達(dá)到了需要進(jìn)行內(nèi)存整理的狀態(tài),為了保障用戶(hù)界面不停止響應(yīng),只能消毀這些進(jìn)程;
2、可視進(jìn)程是擁有一個(gè)用戶(hù)在屏幕上可見(jiàn)的,但并沒(méi)有在前端顯示的Activity(它的onPause已被調(diào)用)的進(jìn)程。例如:一個(gè)以對(duì)話框顯示的前端activity在屏幕上顯示,而它后面的上一級(jí)activity仍然是可見(jiàn)的。這樣的進(jìn)程是非常重要的,一般不會(huì)被消毀,除非為了保障所有的前端進(jìn)程正常運(yùn)行,才會(huì)被消毀。
3、服務(wù)進(jìn)程是擁有一個(gè)由startService()方法啟動(dòng)的Service的進(jìn)程。盡管這些進(jìn)程對(duì)于使用者是不可見(jiàn)的,但他們做的通常是使用者所關(guān)注的事情(如后臺(tái)MP3播放器或后臺(tái)上傳下載數(shù)據(jù)的網(wǎng)絡(luò)服務(wù))。因此,除非為了保障前端進(jìn)程和可視進(jìn)程的正常運(yùn)行,系統(tǒng)才會(huì)消毀這種進(jìn)程。
4、后臺(tái)進(jìn)程是擁有一個(gè)用戶(hù)不可見(jiàn)的Activity(onStop()方法已經(jīng)被調(diào)用)的進(jìn)程。這些進(jìn)程不直接影響用戶(hù)的體驗(yàn)。如果這些進(jìn)程正確地完成了自己的生命周期(詳細(xì)參考Activity類(lèi)),系統(tǒng)會(huì)為了以上三種類(lèi)型進(jìn)程,而隨時(shí)消毀這種進(jìn)程以釋放內(nèi)存。通常會(huì)有很多這樣的進(jìn)程在運(yùn)行著,因些這些進(jìn)程會(huì)被保存在一個(gè)LRU列表中,以保證在內(nèi)存不足時(shí),用戶(hù)最后看到的進(jìn)程將在最后才被消毀。
5、空進(jìn)程是那些不擁有任何活動(dòng)的應(yīng)用組件的進(jìn)程。保留這些進(jìn)程的唯一理由是,做為一個(gè)緩存,在它所屬的應(yīng)用的組件下一次需要時(shí),縮短啟動(dòng)的時(shí)間。同樣的,為了在這些緩存的空進(jìn)程和底層的核心緩存之間平衡系統(tǒng)資源,系統(tǒng)會(huì)經(jīng)常消毀這些空進(jìn)程。
當(dāng)要對(duì)一個(gè)進(jìn)程進(jìn)行分類(lèi)時(shí),系統(tǒng)會(huì)選擇在這個(gè)進(jìn)程中所有活動(dòng)的組件中重要等級(jí)最高的那個(gè)做為依據(jù)。可以參考Activity、Service、IntentReceiver文檔,了解這些組件如何影響進(jìn)程整個(gè)生命周期的更多細(xì)節(jié)。這些類(lèi)的文檔都對(duì)他們?nèi)绾斡绊懰麄兯鶎俚膽?yīng)用的整個(gè)生命周期,做了詳細(xì)的描述。
轉(zhuǎn)載地址:http://hi.baidu.com/weiyousheng/blog/item/c56fa81940f1bd72dbb4bd55.html