天天看點

Android開發之旅:元件生命周期(三)

Android系統試圖盡可能長地保持一個應用程式程序,但是當記憶體低時它最終還是需要移除舊的程序。為了決定保持哪個程序及殺死哪個程序,Android将每個程序放入一個基于運作于其中的元件的重要性等級和這些元件的狀态。重要性最低的程序首先被殺死,然後是次低,以此類推。總共有5個層次等級。下列清單按重要性順序列出:

1.  前台程序,使用者目前工作所需要的。一個程序如果滿足下列任何條件被認為是前台程序:

1.  它正運作着一個正在與使用者互動的活動(Activity對象的onResume()方法已經被調用)。

2.  它寄宿了一個服務,該服務與一個與使用者互動的活動綁定。

3.  它有一個Service對象執行它的生命周期回調(onCreate()、onStart()、onDestroy())。

4.  它有一個BroadcastReceiver對象執行他的onReceive()方法。 

在給定時間内僅有少數的前台程序存在。僅作為最後采取的措施他們才會被殺掉——如果記憶體太低以至于他們不能繼續運作。一般來說,就在那時,裝置達到一個記憶體???狀态,是以殺掉某些前台程序以保持使用者界面響應。

2.  可視程序,他沒有任何前台元件,但是仍然能影響使用者在螢幕上看到東西。一個程序滿足下面任何一個條件都被認為是可視的:

1.  它寄宿着一個不是前台的活動,但是它對使用者仍可見(它的onPause()方法已經被調用)。舉例來說,這可能發送在,如果一個前台活動是一個對話框且運作之前的活動在其後面仍可視。

2.  它寄宿着一個服務,該服務綁定到一個可視的活動。 

一個可視程序被認為是及其重要的且不會被殺死,除非為了保持前台程序運作。

3.  服務程序,是一個運作着一個用startService()方法啟動的服務,并且該服務并沒有落入上面2種分類。雖然服務程序沒有直接關系到任何使用者可見的,它們通常做使用者關心的事(諸如在背景播放mp3或者從網絡上下載下傳資料),是以系統保持它們運作,除非沒有足夠記憶體随着所有的前台程序和可視程序保持它們。

4.  背景程序,是一個保持着一個目前對使用者不可視的活動(已經調用Activity對象的onStop()方法)。這些程序沒有直接影響使用者體驗,并且可以在任何時候被殺以收回記憶體用于一個前台、可視、服務程序。一般地有很多背景程序運作着,是以它們保持在一個LRU(least recently used,即最近最少使用,如果您學過作業系統的話會覺得它很熟悉,跟記憶體的頁面置換算法LRU一樣。)清單以確定最近使用最多的活動的程序最後被殺。如果一個活動執行正确地執行它的生命周期方法,且捕獲它目前的狀态,殺掉它對使用者的體驗沒有有害的影響。

5.  空程序,是一個沒有保持活躍的應用程式元件的程序。保持這個程序可用的唯一原因是作為一個cache以提高下次啟動元件的速度。系統程序殺死這些程序,以在程序cache和潛在的核心cache之間平衡整個系統資源。

Android把程序标記為它可以的最進階,即程序中活躍的元件中重要性最高的那個(選取重要性最高的那個作為程序的重要性級别)。例如,有一個程序寄宿着一個服務和一個可視活動,程序的級别被設定為可視程序級别,而不是服務程序級别(因為可視程序級别比服務程序級别高)。

此外,一個程序的排名因為其他程序依賴它而上升。一個程序服務其它程序,它的排名從不會比它服務的程序低。例如,程序A中的一個内容提供者服務程序B中的一個客戶,或者程序A中的一個服務綁定到程序B中的一個元件,程序A總是被認為比程序B重要。

因為一個運作一個服務程序排名比一個運作背景活動的程序排名高,一個活動啟動一個服務來初始化一個長時間運作操作,而不是簡單地衍生一個線程——特别是如果操作很可能會拖垮活動。這方面的例子是在背景播放音樂和上傳相機拍攝的圖檔到一個網站。使用服務保證操作至少有“服務程序”的優先級,無論活動發生什麼情況。

本系列的其它文章:

<a href="http://skynet.blog.51cto.com/1943397/365407" target="_blank">Android 開發之旅:環境搭建及HelloWorld</a>

<a href="http://skynet.blog.51cto.com/1943397/365402" target="_blank">Android 開發之旅:HelloWorld項目的目錄結構</a>

<a href="http://skynet.blog.51cto.com/1943397/365394" target="_blank">Android 開發之旅:android架構</a>

<a href="http://skynet.blog.51cto.com/1943397/365392" target="_blank">Android 開發之旅:應用程式基礎及元件</a>

<a href="http://skynet.blog.51cto.com/1943397/365389" target="_blank">Android 開發之旅:應用程式基礎及元件(續)</a>

<a href="http://skynet.blog.51cto.com/1943397/365383" target="_blank">Android 開發之旅:活動與任務</a>

<a href="http://skynet.blog.51cto.com/1943397/365379" target="_blank">Android 開發之旅:程序與線程</a>

<a href="http://skynet.blog.51cto.com/1943397/365375" target="_blank">Android 開發之旅:元件生命周期(一)</a>

<a href="http://skynet.blog.51cto.com/1943397/365371" target="_blank">Android 開發之旅:元件生命周期(二)</a>

建議您從頭再看一遍,絕對會有新的收獲!

從android架構到這篇基本内容都是意譯自Android SDK文檔。

     本文轉自Saylor87 51CTO部落格,原文連結:http://blog.51cto.com/skynet/365362,如需轉載請自行聯系原作者

繼續閱讀