首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 14343|回復(fù): 0
上一主題 下一主題
[教程]

《Android Dev Guide》系列教程7:Android生命周期之serviceBroadcast

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
>     
Broadcast的生命周期只有一個回調(diào)方法:   
void onReceive(Context curContext,Intent broadcastMsg)   
當broadcast消息到達接收者時,Android會調(diào)用他的onReceive()方法,并且傳遞包含這個信息的intent對象。broadcast接收者在執(zhí)行這個方法時,被認為是活動的。當onReceive()方法返回時,它停止的活動狀態(tài)。   
一個活動的廣播接受者進程是不能被殺死的,但是當他所消耗的內(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)用的進程,但當可用內(nèi)存很低時最終要移走一部分進程。怎樣確定那些程序可以運行,那些要被銷毀,Android讓每一個進程在一個重要級的基礎(chǔ)上運行,重要級低的進程最有可能被淘汰,一共有5級,下面這個列表就是按照重要性排列的:   
1   
前臺進程顯示的是用戶此時需要處理和顯示的。下列的條件有任何一個成立,這個進程都被認為是在前臺運行的。   
@ 與用戶正發(fā)生交互的。   
@ 它控制一個與用戶交互的必須的基本的服務(wù)。   
@ 有一個正在調(diào)用生命周期的回調(diào)函數(shù)的service(如onCreate()、onStar()、onDestroy())   
@ 它有一個正在運行onReceive()方法的廣播接收對象。   
只有少數(shù)的前臺進程可以在任何給定的時間內(nèi)運行,銷毀他們是系統(tǒ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可見的對話框,即當前activity半透明,能看到前一個activity的界面。   
@ 它是一個服務(wù)于可用activity的服務(wù)。   
3   
一個服務(wù)進程是一個通過調(diào)用startService()方法啟動的服務(wù),并且不屬于前兩種情況。盡管服務(wù)進程沒有直接被用戶看到,但他們確實是用戶所關(guān)心的,比如后臺播放音樂或網(wǎng)絡(luò)下載數(shù)據(jù)。所以系統(tǒng)保證他們的運行,直到不能保證所有的前臺可見程序都正常運行時才會終止他們。   
4   
一個后臺進程就是一個非當前正在運行的activity(activity的onStop()方法已經(jīng)被調(diào)用),他們不會對用戶體驗造成直接的影響,當沒有足夠內(nèi)存來運行前臺可見程序時,他們將會被終止。通常,后臺進程會有很多個在運行,所以他們維護一個LRU最近使用程序列表來保證經(jīng)常運行的activity能最后一個被終止。如果一個activity正確的實現(xiàn)了生命周期的方法,并且保存它當前狀態(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生命周
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2024-10-23 06:25 , Processed in 0.060332 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表