Android 進程優(yōu)先級和 LowMemoryKiller 機制 - 1

一 進程生命周期

Android 系統(tǒng)會盡量長時間地保持應(yīng)用進程,用戶應(yīng)用退出后,如果沒有主動把進程 kill 掉,該進程還會在系統(tǒng)中緩存,這樣用戶再次啟動 App 時,會加速啟動。隨著打開的應(yīng)用越來越多,系統(tǒng)內(nèi)存會變得不足(Out of Memory),為了新建進程或運行更重要的進程,最終需要移除舊進程來回收內(nèi)存。 為了確定保留或終止哪些進程,系統(tǒng)會根據(jù)進程中正在運行的組件以及這些組件的狀態(tài),將每個進程放入“重要性層次結(jié)構(gòu)”中。 必要時,系統(tǒng)會首先消除重要性最低的進程,然后是重要性略遜的進程,依此類推,以回收系統(tǒng)資源。LowMemoryKiller 機制就是系統(tǒng)用于判定是否需要殺進程和殺哪些進程的一個機制。

系統(tǒng)內(nèi)進程優(yōu)先級分 5 級。

  1. 前臺進程 (Foreground process)

    用戶當前操作所必需的進程。如果一個進程滿足以下任一條件,即視為前臺進程:

    • 包含用戶正在交互的 Activity(已調(diào)用 Activity 的 onResume() 方法)
    • 包含某個 Service,后者綁定到用戶正在交互的 Activity
    • 包含正在“前臺”運行的 Service(已調(diào)用 startForeground())
    • 包含正執(zhí)行一個生命周期回調(diào)的 Service(onCreate()、onStart() 或 onDestroy())
    • 包含正執(zhí)行其 onReceive() 方法的 BroadcastReceiver
  2. 可見進程(Visible process)

    沒有任何前臺組件、但仍會影響用戶在屏幕上所見內(nèi)容的進程。 如果一個進程滿足以下任一條件,即視為可見進程:

    • 托管不在前臺、但仍對用戶可見的 Activity(已調(diào)用 onPause() 方法)。例如,如果前臺 Activity 啟動了一個對話框,允許在其后顯示上一 Activity,則有可能會發(fā)生這種情況。
    • 托管綁定到可見(或前臺)Activity 的 Service。

    可見進程被視為是極其重要的進程,除非為了維持所有前臺進程同時運行而必須終止,否則系統(tǒng)不會終止這些進程。

  3. 服務(wù)進程 (Service process)

    正在運行已使用 startService() 方法啟動的服務(wù)且不屬于上述兩個更高類別進程的進程。盡管服務(wù)進程與用戶所見內(nèi)容沒有直接關(guān)聯(lián),但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如,在后臺播放音樂或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺進程和可見進程同時運行,否則系統(tǒng)會讓服務(wù)進程保持運行狀態(tài)。

  4. 后臺進程 (Background process)

    包含目前對用戶不可見的 Activity 的進程(已調(diào)用 Activity 的 onStop() 方法)。這些進程對用戶體驗沒有直接影響,系統(tǒng)可能隨時終止它們,以回收內(nèi)存供前臺進程、可見進程或服務(wù)進程使用。 通常會有很多后臺進程在運行,因此它們會保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進程最后一個被終止。如果某個 Activity 正確實現(xiàn)了生命周期方法,并保存了其當前狀態(tài),則終止其進程不會對用戶體驗產(chǎn)生明顯影響,因為當用戶導(dǎo)航回該 Activity 時,Activity 會恢復(fù)其所有可見狀態(tài)。有關(guān)保存和恢復(fù)狀態(tài)的信息,請參閱 Activity文檔。

  5. 空進程 (Empty process)

    不含任何活動應(yīng)用組件的進程。保留這種進程的的唯一目的是用作緩存,以縮短下次在其中運行組件所需的啟動時間。 為使總體系統(tǒng)資源在進程緩存和底層內(nèi)核緩存之間保持平衡,系統(tǒng)往往會終止這些進程。

關(guān)于進程優(yōu)先級需要注意的內(nèi)容:

  • 根據(jù)進程中當前活動組件的重要程度,Android 會將進程評定為它可能達到的最高級別。例如,如果某進程托管著服務(wù)和可見 Activity,則會將此進程評定為可見進程,而不是服務(wù)進程。

  • 此外,一個進程的級別可能會因其他進程對它的依賴而有所提高,即服務(wù)于另一進程的進程其級別永遠不會低于其所服務(wù)的進程。 例如,如果進程 A 中的內(nèi)容提供程序為進程 B 中的客戶端提供服務(wù),或者如果進程 A 中的服務(wù)綁定到進程 B 中的組件,則進程 A 始終被視為至少與進程 B 同樣重要。

  • 由于運行服務(wù)的進程其級別高于托管后臺 Activity 的進程,因此啟動長時間運行操作的 Activity 最好為該操作啟動服務(wù),而不是簡單地創(chuàng)建工作線程,當操作有可能比 Activity 更加持久時尤要如此。例如,正在將圖片上傳到網(wǎng)站的 Activity 應(yīng)該啟動服務(wù)來執(zhí)行上傳,這樣一來,即使用戶退出 Activity,仍可在后臺繼續(xù)執(zhí)行上傳操作。使用服務(wù)可以保證,無論 Activity 發(fā)生什么情況,該操作至少具備“服務(wù)進程”優(yōu)先級。 同理,廣播接收器也應(yīng)使用服務(wù),而不是簡單地將耗時冗長的操作放入線程中。

NEXT: http://www.itdecent.cn/p/cd6510aa9150

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,828評論 25 709
  • 前言:本文所寫的是博主的個人見解,如有錯誤或者不恰當之處,歡迎私信博主,加以改正!原文鏈接,demo鏈接 當某個應(yīng)...
    PassersHowe閱讀 601評論 0 1
  • 愛情的世界里,或許,每個人都期望遇見一個「待你如初,疼你入骨」的人。 但是,通常待你如初的人鳳毛麟角,傷的你遍體鱗...
    南城花未開1314閱讀 370評論 0 0
  • CSS是一種叫做樣式表(stylesheet)的技術(shù)。也有的人稱之為層疊樣式表(Cascading Stylesh...
    _Lily閱讀 163評論 0 1
  • 這個世界除了清晰,更多的是模糊. 抬頭看天空,到處都是重影,本該有足跡的云兒,連成一片,讓你無從分辨.遠處的建筑零...
    欺塵閱讀 777評論 0 1

友情鏈接更多精彩內(nèi)容