Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發之旅:組件生命周期(三)

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

編輯: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重要。

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

轉自:http://www.cnblogs.com/skynet/archive/2010/05/07/1730010.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved