Android 進程生命週期 Process Lifecycle

進程的生命週期

  Android系統會盡力保持應用的進程,但是有時爲了給新的進程和更重要的進程回收一些內存空間,它會移除一些舊的進程。

  爲了決定哪些進程留下,哪些進程被殺死,系統根據在進程中在運行的組件及組件的狀態,爲每一個進程分配了一個優先級等級。

  優先級最低的進程首先被殺死。

  這個進程重要性的層次結構有五個等級,下面就列出這五種進程,按照重要性來排列,最重要的放在最前。

 

一.前臺進程 Foreground process

  前臺進程是用戶當前做的事所必須的進程,如果滿足下面各種情況中的一種,一個進程被認爲是在前臺:

  1.進程持有一個正在與用戶交互的Activity(Activity正處於onResume()的狀態)。

  2.進程持有一個Service,這個Service和用戶正在交互的Activity綁定。

  3.進程持有一個Service,這個Service是在前臺運行的,即它調用了 startForeground()

  4.進程持有一個Service,這個Service正在執行它的生命週期回調函數(onCreate()onStart(), or onDestroy())。

  5.進程持有一個BroadcastReceiver,這個BroadcastReceiver正在執行它的 onReceive() 方法。

  殺死前臺進程需要用戶交互,因爲前臺進程的優先級是最高的。

 

二.可見進程 Visible process

  如果一個進程不含有任何前臺的組件,但是仍然影響着用戶在屏幕上可以看到的內容,就是可見進程

  可見進程滿足下列情況之一:

  1.進程持有一個Activity,這個Activity不在前臺,但是仍然被用戶可見(處於onPause()調用後又沒有調用onStop()的狀態)。

  這種情況發生在,比如,前臺的activity打開了一個對話框,這樣activity就會在其後可見。

  2.進程持有一個Service,這個Service和一個可見的(或者前臺的)Activity綁定。

  可見的進程也被認爲是很重要的,一般不會被銷燬,除非是爲了保證所有前臺進程的運行而不得不殺死可見進程的時候。

 

三.服務進程 Service process

  如果一個進程中運行着一個service,這個service是通過 startService() 開啓的,並且不屬於上面兩種較高優先級的情況,這個進程就是一個服務進程

  儘管服務進程沒有和用戶可以看到的東西綁定,但是它們一般在做的事情是用戶關心的,比如後臺播放音樂,後臺下載數據等。

 

四.後臺進程 Background process

  如果進程不屬於上面三種情況,但是進程持有一個用戶不可見的activity(activity的onStop()被調用,但是onDestroy()沒有調用的狀態),就認爲進程是一個後臺進程

  後臺進程不直接影響用戶體驗,系統會爲了前臺進程、可見進程、服務進程而任意殺死後臺進程。

  通常會有很多個後臺進程存在,它們會被保存在一個LRU (least recently used)列表中,這樣就可以確保用戶最近使用的activity最後被銷燬,即最先銷燬時間最遠的activity。

 

五.空進程

  如果一個進程不包含任何活躍的應用組件,則認爲是空進程

  保存這種進程的唯一理由是爲了緩存的需要,爲了加快下次要啓動這個進程中的組件時的啓動時間。

  系統爲了平衡進程緩存和底層內核緩存的資源,經常會殺死空進程。

 

相關說明

  1.Android會儘可能地把進程放在高的優先級。

  比如,一個進程擁有一個可見狀態的activity和一個service,這個進程會被認爲是可見進程,而不是服務進程。

  2.一個進程的等級有可能會因爲其他進程的依賴而提高,一個進程服務於另一個進程,則它的優先級不會比它服務的進程優先級低。

  比如,A進程中的一個content provider向B進程中的一個客戶提供服務,或A進程中的一個service被綁定在B進程中的一個組件上,則A進程的優先級至少和B進程的優先級一樣高。

  3.因爲服務進程的優先級比後臺進程的優先級高,所以對於一個需要啓動一個長時間操作的activity來說,開啓一個service比創建一個工作線程的方法更好,尤其是對於操作將很可能超出activity的持續時間時。

  比如要上傳一個圖片文件,應該開啓一個service來進行上傳工作,這樣在用戶離開activity時工作仍在進行。使用service將會保證操作至少有服務進程的優先級。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章