1. 程式人生 > >Android進程的生命周期

Android進程的生命周期

ble ack activity 假設 roi pid rec cti ive

Android系統想要永久的保留一個應用進程差點兒是不可能的。所以系統就須要不斷的釋放老的或者不太重要的進程以便騰出足夠的內存空間來執行新的或者更重要的進程,那麽系統怎樣決定哪個進程應該保留哪個應該殺死呢,原來系統會依據進程中執行組件以及他們的狀態列出一個“重要層級”。當內存出現緊張的時候。系統會首先殺死最不重要的進程,接著是第二個。第三個。

。。以此類推來不斷的釋放系統資源直到內存不再緊張為止。

依據這個重要層級系統把進程分為了5個級別。以下要說的就是這五種不同的進程類型:

1、foreground process



此進程類型須要知道用戶當前正在做什麽,滿足一下隨意條件就可以覺得是foreground process:

(1)正處於activity resume狀態
(2)正處於bound服務交互的狀態
(3)正處於服務在前臺執行的狀態(StartForeGround()被調用)
(4)Service生命周期正在被執行(onCreate()。onStart(),onDestroy())
(5)BroadcastReceiver正在執行onReceive()方法

殺死foreground須要用戶響應。由於這個安全優先級是最高的是用戶操作所必須的,任一時間下,僅有少數進程會處於前臺。僅當內存實在無法供給它們維持同一時候執行時才會被殺死。一般來說。在這樣的情況下。設備依舊處於使用虛擬內存的狀態,必須要殺死一些前臺進程以用戶界面保持響應。

Android會依據進程中當前活躍組件的重要程度來盡可能高的估量一個進程的級別。

比方說。假設一個進程中同一時候有一個服務和一個可視的activity,則進程會被判定為可視進程,而不是服務進程。

2、visible process

(1)activity不在前端顯示,但也沒有全然隱藏,能夠看得見,比方彈出一個對話框
(2)一個bound到visible或者foreground的activity的service

沒有前臺組件,但仍可被用戶在屏幕上所見。

當滿足例如以下任一條件時。進程被覺得是可視的:

? 它包括著一個不在前臺,但仍然為用戶可見的activity(它的onPause()方法被調用)。這樣的情況可能出如今以下情況:比方說,前臺activity是一個對話框,而之前的activity位於其下並能夠看到。


? 它包括了一個綁定至一個可視的activity的服務。
可視進程依舊被視為是非常重要的。非到不殺死它們便無法維持前臺進程執行時,才會被殺死。

3、Service process

正在執行的,不在上述兩種狀態的service。

是由 startService() 方法啟動的服務,它不會變成上述兩類。雖然服務進程不會直接為用戶所見,但它們一般都在做著用戶所關心的事情(比方在後臺播放mp3或者從網上下載東 西)。

所以系統會盡量維持它們的執行,除非系統內存不足以維持前臺進程和可視進程的執行須要。

4、background process

不可見狀態的activity進程,onstop被調用。

包括眼下不為用戶所見的activity(Activity對象的 onStop() 方法已被調用)。這些進程與用戶體驗沒有直接的聯系。能夠在隨意時間被殺死以回收內存供前臺進程、可視進程以及服務進程使用。

一般來說,會有非常多背景進程 執行。所以它們一般存放於一個LRU(最後使用)列表中以確保最後被用戶使用的activity最後被殺死。假設一個activity正確的實現了生命周 期方法,並捕獲了正確的狀態,則殺死它的進程對用戶體驗不會有不論什麽不良影響。

5、empty process

沒有執行不論什麽component的進程。保留這個進程主要是為了緩存的須要

不包括不論什麽活動應用程序組件。

這樣的進程存在的唯一原因是做為緩存以改善組件再次於當中執行時的啟動時間。系統常常會殺死這樣的進程以保持進程緩存和系統內核緩存之間的平衡。


此外。一個進程的級別可能會由於其他進程依賴於它而升高。一個為其他進程提供 服務的進程級別永遠高於使用它服務的進程。比方說,假設A進程中的內容提供者為進程B中的client提供服務。或進程A中的服務為進程B中的組件所綁定。則A 進程最低也會被視為與進程B擁有相同的重要性。

Android進程的生命周期