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