|
>
Broadcast的生命周期只有一個回調(diào)方法:
void onReceive(Context curContext,Intent broadcastMsg)
當(dāng)broadcast消息到達接收者時,Android會調(diào)用他的onReceive()方法,并且傳遞包含這個信息的intent對象。broadcast接收者在執(zhí)行這個方法時,被認(rèn)為是活動的。當(dāng)onReceive()方法返回時,它停止的活動狀態(tài)。
一個活動的廣播接受者進程是不能被殺死的,但是當(dāng)他所消耗的內(nèi)存被別的進程需要時,一個非活動狀態(tài)的進程可以被系統(tǒng)隨時殺死。
這帶來一個問題,相應(yīng)一個廣播消息是非常耗時的,因此,很多事情需要在一個獨立的線程中執(zhí)行,而不是在主線程里。如果onReceive()方法啟動一個線程,那么整個進程包括剛啟動的新線程,是非活動狀態(tài)的,(除非進程里其他應(yīng)用程序組件有活動的),所以有被系統(tǒng)銷毀的危險。這個問題的解決方法是在onReceive()方法里啟動一個服務(wù)然后處理一些事情,所以系統(tǒng)會知道在這個進程里仍然有處于活動狀態(tài)的任務(wù)需要被處理。
下一節(jié)會有更多的弱進程將會被銷毀。
android操作系統(tǒng)嘗試盡可能長時間的保持應(yīng)用的進程,但當(dāng)可用內(nèi)存很低時最終要移走一部分進程。怎樣確定那些程序可以運行,那些要被銷毀,Android讓每一個進程在一個重要級的基礎(chǔ)上運行,重要級低的進程最有可能被淘汰,一共有5級,下面這個列表就是按照重要性排列的:
1
前臺進程顯示的是用戶此時需要處理和顯示的。下列的條件有任何一個成立,這個進程都被認(rèn)為是在前臺運行的。
@ 與用戶正發(fā)生交互的。
@ 它控制一個與用戶交互的必須的基本的服務(wù)。
@ 有一個正在調(diào)用生命周期的回調(diào)函數(shù)的service(如onCreate()、onStar()、onDestroy())
@ 它有一個正在運行onReceive()方法的廣播接收對象。
只有少數(shù)的前臺進程可以在任何給定的時間內(nèi)運行,銷毀他們是系統(tǒng)萬不得已的、最后的選擇——當(dāng)內(nèi)存不夠系統(tǒng)繼續(xù)運行下去時。通常,在這一點上,設(shè)備已經(jīng)達到了內(nèi)存分頁狀態(tài),所以殺掉一些前臺進程來保證能夠響應(yīng)用戶的需求。
2
一個可用進程沒有任何前臺組件,但它仍然可以影響到用戶的界面。下面兩種情況發(fā)生時,可以稱該進程為可用進程。
@ 它是一個非前臺的activity,但對用戶仍然可用,(onPause()方法已經(jīng)被調(diào)用)。這是可能發(fā)生的,例如:前臺的activity是一個允許上一個activity可見的對話框,即當(dāng)前activity半透明,能看到前一個activity的界面。
@ 它是一個服務(wù)于可用activity的服務(wù)。
3
一個服務(wù)進程是一個通過調(diào)用startService()方法啟動的服務(wù),并且不屬于前兩種情況。盡管服務(wù)進程沒有直接被用戶看到,但他們確實是用戶所關(guān)心的,比如后臺播放音樂或網(wǎng)絡(luò)下載數(shù)據(jù)。所以系統(tǒng)保證他們的運行,直到不能保證所有的前臺可見程序都正常運行時才會終止他們。
4
一個后臺進程就是一個非當(dāng)前正在運行的activity(activity的onStop()方法已經(jīng)被調(diào)用),他們不會對用戶體驗造成直接的影響,當(dāng)沒有足夠內(nèi)存來運行前臺可見程序時,他們將會被終止。通常,后臺進程會有很多個在運行,所以他們維護一個LRU最近使用程序列表來保證經(jīng)常運行的activity能最后一個被終止。如果一個activity正確的實現(xiàn)了生命周期的方法,并且保存它當(dāng)前狀態(tài),殺死這些進程將不會影響到用戶體驗。
5
一個空線程沒有運行任何可用應(yīng)用程序組,保留他們的唯一原因是為了設(shè)立一個緩存機制,來加快組件啟動的時間。系統(tǒng)經(jīng)常殺死這些內(nèi)存來平衡系統(tǒng)的整個系統(tǒng)的資源,進程緩存和基本核心緩存之間的資源。
Android把進程里優(yōu)先級最高的activity或服務(wù),作為這個進程的優(yōu)先級。例如,一個進程擁有一個服務(wù)和一個可見的activity,那么這個進程將會被定義為可見進程,而不是服務(wù)進程。
此外,如果別的進程依賴某一個進程的話,那么被依賴的進程會提高優(yōu)先級。一個進程服務(wù)于另一個進程,那么提供服務(wù)的進程不會低于獲得服務(wù)的進程。例如,如果進程A的一個內(nèi)容提供商服務(wù)于進程B的一個客戶端,或者進程A的一個service被進程B的一個組件綁定,那么進程A至少擁有和進程B一樣的優(yōu)先級,或者更高。
操作來啟動一個服務(wù),而不是啟動一個線程--尤其是這個操作可能會拖垮這個activity。例如后臺播放音樂的同時,通過照相機向服務(wù)器發(fā)送一張照片。啟動一個服務(wù)會保證這個操作至少運行在service 進程的優(yōu)先級下,無論這個activity發(fā)生了什么。就想前面章節(jié)提到的那樣,廣播接收者應(yīng)該作為一個空服務(wù)而不是簡單的把耗時的操作單獨放在一個線程里。
|
上一篇: 《Android Dev Guide》系列教程8:用戶界面下一篇: 《Android Dev Guide》系列教程6:Android生命周期之a(chǎn)ctivity生命周
|