Android程式生命週期ProcessLifecycle
程式的生命週期
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
相關文章
- Android Activity生命週期Android
- Android之各生命週期Android
- Android Service生命週期淺析Android
- Flutter仿Android生命週期LifecycleStateFlutterAndroid
- Android View的生命週期詳解AndroidView
- Android 監聽生命週期工具庫Android
- Android中元件生命週期完全解析Android元件
- Android全面解析之Activity生命週期Android
- ASP.NET頁面生命週期與應用程式生命週期ASP.NET
- Android Activity生命週期的一點感悟Android
- Android知識重溫之生命週期Android
- Android生命週期元件Lifecycle使用詳解Android元件
- Android:聊聊 MVP 中 Presenter 的生命週期AndroidMVP
- 微信小程式--生命週期微信小程式
- 微信小程式生命週期微信小程式
- 生命週期
- 擼擼Android的羊毛(二)----Activity生命週期Android
- View生命週期與Activity生命週期的關係View
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven
- Activity生命週期
- React生命週期React
- Salesforce 生命週期管理(一)應用生命週期淺談Salesforce
- Android | Activity和Fragment最全生命週期+發現大牛AndroidFragment
- Android入門教程之Activity(生命週期,啟動...)Android
- mpvue小程式開發 - 生命週期梳理Vue
- 微信小程式頁面的生命週期微信小程式
- vue 生命週期梳理Vue
- java servlet 生命週期JavaServlet
- Activity生命週期onDestroy
- React-生命週期React
- IOC與生命週期