根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...
正文
????首先應用進程的生命周期并不由應用本身直接控制,而是由系統綜合多種因素來確定的。Android系統有自己的一套標準,它可以根據這套標準區分當前運行的所有進程的重要性。這是 Android 非常獨特的一個基本功能。
????在大多數情況下,每個 Android 應用都在各自的 Linux 進程中運行。當需要運行應用的一些代碼時,系統會為應用創建此進程,并使其保持運行,直到不再需要它或者系統內存不足需要回收以供其他應用使用才會終止它。
????我們作為應用開發者必須了解不同的應用組件(特別是?Activity、Service?和?BroadcastReceiver)對應用進程的生命周期影響。這些組件使用不當會導致你的應用進程直接被終止,比如系統需要執行重要任務時。
????舉個我們常見的例子:
????在我們使用?BroadcastReceiver?的?BroadcastReceiver.onReceive()?方法中接收到一個 Intent 時,它會啟動一個線程,并從該函數返回。可是一旦返回,系統會認為 BroadcastReceiver 不再處于活動狀態,然后就不再托管進程(除非其中有其他應用組件處于活動狀態)。因此,系統可能會隨時終止進程以回收內存,這樣會導致在進程中運行的衍生線程直接終止而給我們的應用帶來重大影響。
????解決辦法:
????要解決這個問題,通常可以從 BroadcastReceiver 調度?JobService,這樣系統就知道進程中還有處于活動狀態的任務正在進行中,從而不會去主動終止它。
????但是,在系統內存不足的時候,系統還是會去終止一些應用的進程來釋放足夠的內存來保證系統的穩定性。要想了解系統是怎么選擇被終止進程的,那就需要我們足夠的了解系統“重要性優先級”:
前臺進程是用戶目前執行操作所需的進程。在不同的情況下,進程可能會因為其所包含的各種應用組件而被視為前臺進程。如果以下任一條件成立,則進程會被認為位于前臺:
條件一:它正在用戶的互動屏幕上運行一個?Activit(其?onResume()?方法已被調用)。
條件二:它有一個?BroadcastReceiver?目前正在運行(其?BroadcastReceiver.onReceive()?方法正在執行)。
條件三:它有一個?Service?目前正在執行其某個回調(Service.onCreate()、Service.onStart()?或?Service.onDestroy())中的代碼。
????系統中只有少數此類進程,而且除非內存過低,導致連這些進程都無法繼續運行,才會在最后一步終止這些進程。
可見進程正在進行用戶當前知曉的任務,因此終止該進程會對用戶體驗造成明顯的負面影響。在以下條件下,進程將被視為可見:
條件一:它正在運行的?Activity?在屏幕上對用戶可見,但不在前臺(其?onPause()?方法已被調用)。舉例來說,如果前臺 Activity 顯示為一個對話框,而這個對話框允許在其后面看到上一個 Activity,則可能會出現這種情況。
條件二:它有一個?Service?正在通過?Service.startForeground()(要求系統將該服務視為用戶知曉或基本上對用戶可見的服務)作為前臺服務運行。
條件三:系統正在使用其托管的服務實現用戶知曉的特定功能,例如動態壁紙、輸入法服務等。
相比前臺進程,系統中運行的這些進程數量較不受限制,但仍相對受控。這些進程被認為非常重要,除非系統為了使所有前臺進程保持運行而需要終止它們,否則不會這么做。
服務進程包含一個已使用?startService()?方法啟動的?Service。雖然用戶無法直接看到這些進程,但它們通常正在執行用戶關心的任務(例如后臺網絡數據上傳或下載),因此系統會始終使此類進程保持運行,除非沒有足夠的內存來保留所有前臺和可見進程。
????已經運行了很長時間(例如 30 分鐘或更長時間)的服務的重要性可能會降位,以使其進程降至下文所述的緩存 LRU 列表。這有助于避免超長時間運行的服務因內存泄露或其他問題占用大量內存,進而妨礙系統有效利用緩存進程。
緩存進程是目前不需要的進程,因此,如果其他地方需要內存,系統可以根據需要自由地終止該進程。在正常運行的系統中,這些是內存管理中涉及的唯一進程:運行良好的系統將始終有多個緩存進程可用(為了更高效地切換應用),并根據需要定期終止最早的進程。只有在非常危急(且具有不良影響)的情況下,系統中的所有緩存進程才會被終止,此時系統必須開始終止服務進程。
????這些進程通常包含用戶當前不可見的一個或多個?Activity?實例(onStop()?方法已被調用并返回)。只要它們正確實現其 Activity 生命周期(詳情請見?Activity),那么當系統終止此類流程時,就不會影響用戶返回該應用時的體驗,因為當關聯的 Activity 在新的進程中重新創建時,它可以恢復之前保存的狀態。
????這些進程保存在偽 LRU 列表中,列表中的最后一個進程是為了回收內存而終止的第一個進程。此列表的確切排序政策是平臺的實現細節,但它通常會先嘗試保留更多有用的進程(比如托管用戶的主屏幕應用、用戶最后看到的 Activity 的進程等),再保留其他類型的進程。還可以針對終止進程應用其他政策:比如對允許的進程數量的硬限制,對進程可持續保持緩存狀態的時間長短的限制等。
在決定如何對進程進行分類時,系統會參考進程中當前活動的所有組件中最重要的級別。
進程的優先級也可能因從屬于進程的其他依賴項而提升。例如,如果進程 A 已通過?Context.BIND_AUTO_CREATE?標記綁定到?Service,或在使用進程 B 中的?ContentProvider,則進程 B 的分類始終至少和進程 A 一樣重要。
總結
以上是生活随笔為你收集整理的根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: transpose公式_EXCEL转置你
- 下一篇: android sina oauth2.