Android中進(jìn)程生命周期的優(yōu)先級(jí)
學(xué)習(xí)Android最好的途徑當(dāng)然是強(qiáng)大的官方文檔了,其中在Processes and Threads一節(jié)中對(duì)于進(jìn)程生命周期淘汰優(yōu)先級(jí),有著詳細(xì)的介紹。就不給大家轉(zhuǎn)帖了,直接放譯文吧,如下:
Android系統(tǒng)會(huì)盡量維持進(jìn)程的存在,但畢竟資源有限,當(dāng)系統(tǒng)資源告急的時(shí)候會(huì)淘汰一部分進(jìn)程。淘汰順序的憑據(jù)就是系統(tǒng)進(jìn)程的優(yōu)先級(jí)了,優(yōu)先級(jí)越高越不容易被殺死,反之亦然。系統(tǒng)總共為進(jìn)程分了五個(gè)優(yōu)先級(jí),如下
一、前臺(tái)進(jìn)程(進(jìn)程滿足如下任一條件即為前臺(tái)進(jìn)程):
1. 擁有 一個(gè)執(zhí)行了onresume方法正在與用戶交互(獲得焦點(diǎn))的Activity
2. 擁有一個(gè)service,這個(gè)Service跟正在與用戶交互的Activity進(jìn)行了綁定
3. 擁有一個(gè)Service,這個(gè)Service調(diào)用了startForeground()方法
4. 擁有一個(gè)正在執(zhí)行onCreate()、onStart()或者onDestroy()方法中的任意一個(gè)的Service
5. 擁有一個(gè)正在執(zhí)行onReceive方法的BroadcastReceiver
二、可見進(jìn)程:
1. 擁有一個(gè)執(zhí)行了onPause方法,但仍然可見的Activity
2. 擁有一個(gè)Service,這個(gè)Service跟一個(gè)可見的或前臺(tái)的Activity綁定了
三、服務(wù)進(jìn)程:
擁有一個(gè)通過startService方法啟動(dòng)的Service的進(jìn)程
四、后臺(tái)進(jìn)程:
擁有一個(gè)后臺(tái)Activity(onStop方法被調(diào)用)的進(jìn)程
五、空進(jìn)程:
沒有擁有任何活動(dòng)的應(yīng)用組件的進(jìn)程,也就是沒有任何Service和Activity在運(yùn)行
另外,還有一些需要補(bǔ)充的,當(dāng)一個(gè)進(jìn)程滿足多個(gè)進(jìn)程條件時(shí),當(dāng)然是取優(yōu)先級(jí)更高的為準(zhǔn),比如一個(gè)進(jìn)程同時(shí)滿足前臺(tái)進(jìn)程和服務(wù)進(jìn)程的條件,這個(gè)進(jìn)程就是個(gè)前臺(tái)進(jìn)程,這點(diǎn)很好理解。另外,進(jìn)程的優(yōu)先級(jí)也不是一成不變的,而且有時(shí)候會(huì)隨著一些相關(guān)的因素而發(fā)生改變;比如,某進(jìn)程A滿足前臺(tái)進(jìn)程的第二個(gè)條件,進(jìn)程A擁有一個(gè)service,這個(gè)Service跟正在與用戶交互的Activity進(jìn)行了綁定;當(dāng)這個(gè)Activity變成可見狀態(tài)了,進(jìn)程A便不再滿足前臺(tái)進(jìn)程的條件,進(jìn)而因滿足可見進(jìn)程的第二個(gè)條件,進(jìn)程A變成了可見進(jìn)程??傊谡莆樟嘶靖拍钪?,需要細(xì)心的分析具體的情況,方能得出正確的判斷。
進(jìn)程優(yōu)先級(jí)的額外說明
1. 系統(tǒng)會(huì)賦予進(jìn)程盡可能高的優(yōu)先級(jí). 例如一個(gè)進(jìn)程既包含已啟動(dòng)的service, 也包含前臺(tái)activity, 則這個(gè)進(jìn)程會(huì)被視為前臺(tái)進(jìn)程.
2. 由于組件之間的依賴性, 進(jìn)程的優(yōu)先級(jí)有可能被提高. 假如進(jìn)程A服務(wù)于進(jìn)程B, 則進(jìn)程A的優(yōu)先級(jí)不能低于進(jìn)程B. 比如, 進(jìn)程A的ContentProvider組件正在服務(wù)于進(jìn)程B的某個(gè)組件, 或者進(jìn)程A的service組件和進(jìn)程B的某個(gè)組件綁定等, 這些情況下, 進(jìn)程A的優(yōu)先級(jí)都不會(huì)低于進(jìn)程B(如果按照優(yōu)先級(jí)規(guī)則, 進(jìn)程A的優(yōu)先級(jí)確實(shí)低于進(jìn)程B, 則系統(tǒng)會(huì)選擇提高進(jìn)程A的優(yōu)先級(jí)到和進(jìn)程B相同).
3. 由于服務(wù)進(jìn)程的優(yōu)先級(jí)高于后臺(tái)進(jìn)程, 因此如果activity需要執(zhí)行耗時(shí)操作, 最好還是啟動(dòng)一個(gè)service來(lái)完成. 當(dāng)然, 在activity中啟動(dòng)子線程完成耗時(shí)操作也可以, 但是這樣做的缺點(diǎn)在于, 一旦activity不再可見, activity所在的進(jìn)程成為后臺(tái)進(jìn)程, 而內(nèi)存不足時(shí)后臺(tái)進(jìn)程隨時(shí)都有可能被系統(tǒng)殺死(但是啟動(dòng)service完成耗時(shí)操作會(huì)帶來(lái)數(shù)據(jù)交互的問題, 比如耗時(shí)操作需要實(shí)時(shí)更新UI控件的狀態(tài)的話, service就不是一個(gè)好的選擇). 基于同樣的考慮, 在BroadcastReceiver中也不應(yīng)該執(zhí)行耗時(shí)操作, 而應(yīng)該啟動(dòng)service來(lái)完成(當(dāng)然, BroadcastReceiver的生命周期過于短暫, 也決定了不能在其中執(zhí)行耗時(shí)操作).
相關(guān)文章
Kotlin?Dispatchers協(xié)程調(diào)度器源碼深入分析
Kotlin協(xié)程不是什么空中閣樓,Kotlin源代碼會(huì)被編譯成class字節(jié)碼文件,最終會(huì)運(yùn)行到虛擬機(jī)中。所以從本質(zhì)上講,Kotlin和Java是類似的,都是可以編譯產(chǎn)生class的語(yǔ)言,但最終還是會(huì)受到虛擬機(jī)的限制,它們的代碼最終會(huì)在虛擬機(jī)上的某個(gè)線程上被執(zhí)行2022-11-11
融會(huì)貫通Android?Jetpack?Compose中的Snackbar
BroadcastReceiver動(dòng)態(tài)注冊(cè)案例詳解
Android 圖文詳解Binder進(jìn)程通信底層原理
Flutter實(shí)現(xiàn)單選,復(fù)選和開關(guān)組件的示例代碼
Android獲取手機(jī)配置信息具體實(shí)現(xiàn)代碼

