Posted on 2009-11-04 15:59
瘋狂 閱讀(762)
評(píng)論(1) 編輯 收藏 所屬分類:
android
在大部份情況下,每個(gè)Android應(yīng)用都將運(yùn)行在自己的Linux進(jìn)程當(dāng)中。當(dāng)這個(gè)應(yīng)用的某些代碼需要執(zhí)行時(shí),進(jìn)程就會(huì)被創(chuàng)建,并且將保持運(yùn)行,直到該進(jìn)程不再需要,而系統(tǒng)需要釋放它所占用的內(nèi)存,為其他應(yīng)用所用時(shí),才停止。
Android一個(gè)重要并且特殊的特性就是,一個(gè)應(yīng)用的進(jìn)程的生命周期不是由應(yīng)用自身直接控制的,而是由系統(tǒng),根據(jù)運(yùn)行中的應(yīng)用的一些特征來決定的,包括:這些應(yīng)用對(duì)用戶的重要性、系統(tǒng)的全部可用內(nèi)存。
對(duì)于應(yīng)用開發(fā)者來說,理解不同的應(yīng)用組件(特別是Activity、Service、Intent Receiver)對(duì)應(yīng)用進(jìn)程的生命周期的影響,這是非常重要的。如果沒有正確地使用這些組件,將會(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)行的子線程。問題的解決辦法就是,在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),為了保障用戶界面不停止響應(yīng),只能消毀這些進(jìn)程;
2、可視進(jìn)程是擁有一個(gè)用戶在屏幕上可見的,但并沒有在前端顯示的Activity(它的onPause已被調(diào)用)的進(jìn)程。例如:一個(gè)以對(duì)話框顯示的前端activity在屏幕上顯示,而它后面的上一級(jí)activity仍然是可見的。這樣的進(jìn)程是非常重要的,一般不會(huì)被消毀,除非為了保障所有的前端進(jìn)程正常運(yùn)行,才會(huì)被消毀。
3、服務(wù)進(jìn)程是擁有一個(gè)由startService()方法啟動(dòng)的Service的進(jìn)程。盡管這些進(jìn)程對(duì)于使用者是不可見的,但他們做的通常是使用者所關(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è)用戶不可見的Activity(onStop()方法已經(jīng)被調(diào)用)的進(jìn)程。這些進(jìn)程不直接影響用戶的體驗(yàn)。如果這些進(jìn)程正確地完成了自己的生命周期(詳細(xì)參考Activity類),系統(tǒng)會(huì)為了以上三種類型進(jìn)程,而隨時(shí)消毀這種進(jìn)程以釋放內(nèi)存。通常會(huì)有很多這樣的進(jìn)程在運(yùn)行著,因些這些進(jìn)程會(huì)被保存在一個(gè)LRU列表中,以保證在內(nèi)存不足時(shí),用戶最后看到的進(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)行分類時(shí),系統(tǒng)會(huì)選擇在這個(gè)進(jìn)程中所有活動(dòng)的組件中重要等級(jí)最高的那個(gè)做為依據(jù)。可以參考Activity、Service、IntentReceiver文檔,了解這些組件如何影響進(jìn)程整個(gè)生命周期的更多細(xì)節(jié)。這些類的文檔都對(duì)他們?nèi)绾斡绊懰麄兯鶎俚膽?yīng)用的整個(gè)生命周期,做了詳細(xì)的描述。
轉(zhuǎn)載地址:http://hi.baidu.com/weiyousheng/blog/item/c56fa81940f1bd72dbb4bd55.html