首頁 收藏 QQ群
 網站導航

ZNDS智能電視網 推薦當貝市場

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

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

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

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

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

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

查看: 15755|回復: 0
上一主題 下一主題
[教程]

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

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

上一篇:《Android Dev Guide》系列教程8:用戶界面
下一篇:《Android Dev Guide》系列教程6:Android生命周期之activity生命周
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

GMT+8, 2025-4-8 13:50 , Processed in 0.059991 second(s), 15 queries , Redis On.

Powered by Discuz!

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

© 2007-2025 ZNDS.Com

快速回復 返回頂部 返回列表