Android 進程和應用生命周期

默認情況下,每個 Android 應用就是 Linux 的一個進程。當需要運行應用的一些代碼時,系統(tǒng)會為應用創(chuàng)建此進程,并使其保持運行,直到不再需要它且系統(tǒng)需要回收其內存以供其他應用使用。

為了確定在內存不足時系統(tǒng)應該回收哪些進程,Android 會根據(jù)每個進程中運行的組件以及這些組件的狀態(tài),將進程按重要性分為以下幾種進程

  • 前臺進程是用戶目前執(zhí)行操作所需的進程。在不同的情況下,進程可能會因為其所包含的各種應用組件而被視為前臺進程。如果以下任一條件成立,則進程會被認為位于前臺:

    • 它正在用戶的互動屏幕上運行一個 Activity 其 onResume() 方法已被調用。
    • 它有一個 BroadcastReceiver 目前正在運行(其 onReceive() 方法 正在執(zhí)行)
    • 它有一個 Service 目前正在執(zhí)行某個回調(onCreate() 方法、onStartCommand() 方法或者 onDestroy() 方法)。

    系統(tǒng)中只有少數(shù)此類進程,而且除非內存過低,導致連這些進程都無法進行,才會在最后一步終止這些進程。

  • 可見進程正在運行用戶當前知曉的任務,因此終止該進程會對用戶體驗造成明顯的負面影響,在以下條件中,進程將視可見:

    • 它正在運行的 Activity 在屏幕上對用戶可見,但不在前臺(其 onPause() 方法已被調用)。舉例來說,如果前臺 Activity 顯示為一個對話框,而這個對話框允許在其后買你看到上一個 Activity,則可能會出現(xiàn)這種情況。
    • 它有一個 Service 正在通過 startForeground() 作為前臺服務運行。
    • 系統(tǒng)正在使用托管的服務實現(xiàn)用戶知曉的特定功能,例如動態(tài)壁紙、輸入法服務等。

    相比前臺進程,系統(tǒng)中運行的這些進程數(shù)量較不受限制,但仍相對受控。這些進程被認為非常重要,除非系統(tǒng)為了使所有前臺進程保持運行而需要終止它們,否則不會這么做。

  • 服務進程包含一個已使用 startService() 方法啟動的 Service。雖然用戶無法直接看到這些進程,但它們通常正在執(zhí)行用戶關心的任務(例如后臺網(wǎng)絡數(shù)據(jù)上傳或下載),因此系統(tǒng)會始終使此類進程保持運行,除非沒有足夠的內存來保留所有前臺和可見進程。已經運行了很長時間(例如 30 分鐘 或更長時間)的服務的重要性可能會降 位,以使其進程降至下文所述的緩存 LRU 列表。這有助于避免超長時間運行的服務因內存泄漏或其他問題占用大量內存,進而妨礙系統(tǒng)有效利用緩存進程。

  • 緩存進程使目前不需要的進程,因此,如果其他地方需要內存,系統(tǒng)可以根據(jù)需要自由地終止該進程。在正常運行的系統(tǒng)中,這些事內存管理中涉及的唯一進程:運行良好的系統(tǒng)將始終有多個緩存進程可用(為了更高效地切換應用),并根據(jù)需要定期終止最早的進程。只有在非常危急(且具有不良影響)的情況下,系統(tǒng)中的所有緩存進程才會被終止,此時系統(tǒng)必須開始終止服務進程。
    這些進程通常包含用戶當前不可見的一個或多個 Activity 實例(onStop() 方法已被調用并返回)。只要它們正確實現(xiàn)其 Activity 生命周期,那么當系統(tǒng)終止此類流程時,就不會影響用戶返回該應用時的體驗,因為當關聯(lián)的 Activity 在新的進程中重新創(chuàng)建時,它可以恢復之前保存的狀態(tài)。
    這些進程保存在偽 LRU 列表中,列表中的最后一個進程時為了回收內存而終止的第一個進程。此列表的確切排序政策時平臺的實現(xiàn)細節(jié),但它通常會先嘗試保留更多有用的進程(比如托管用戶的主屏幕應用、用戶最后看到的 Activity 的進程等),再保留其他類型的進程。還可以針對終止進程應用其他政策:比如對允許的進程數(shù)量的硬限制,對進程可持續(xù)保持緩存狀態(tài)的時間長短的限制等。

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

友情鏈接更多精彩內容