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將會保證操作至少有服務程式的優先順序。
參考資料
Sandy Zhang Android深入淺出 視訊教程——程式生命週期。
API Guides: Processes and Threads
http://developer.android.com/guide/components/processes-and-threads.html