Android 12 (API 級別為 31) 引入了前臺服務(wù)啟動限制。除少部分特殊場景外,如果您的應(yīng)用的 targetSdkVersion 是 Android 12 或者更高 API 級別的話,應(yīng)用在后臺運行時將不能再啟動前臺服務(wù)。這意味著,如果應(yīng)用當(dāng)前狀態(tài)不符合后臺啟動服務(wù)的條件,調(diào)用 setForeground 時可能會拋出異常。
前臺服務(wù)啟動限制
https://developer.android.google.cn/about/versions/12/foreground-services
特殊場景
https://developer.android.google.cn/guide/components/foreground-services#background-start-restriction-exemptions
setForeground
https://developer.android.google.cn/reference/androidx/work/ListenableWorker#setForegroundAsync(androidx.work.ForegroundInfo)
異常
https://developer.android.google.cn/reference/android/app/ForegroundServiceStartNotAllowedException
因此,我們在 WorkManager 2.7 中做出了部分改進(jìn),使得應(yīng)用在遵守后臺限制的同時可以輕松地安排重要任務(wù)。通過加急任務(wù),應(yīng)用可以輕松地運行耗時短且高優(yōu)先級的任務(wù),例如發(fā)送一條聊天信息或者往社交網(wǎng)絡(luò)上傳一張圖片。推薦使用加急任務(wù)來啟動需要立即執(zhí)行且即使用戶將應(yīng)用放至后臺也能繼續(xù)執(zhí)行的任務(wù)。
加急任務(wù)
https://developer.android.google.cn/about/versions/12/foreground-services#expedited-jobs
如需設(shè)置加急任務(wù),可通過 WorkRequest 的 Builder 對象調(diào)用 setExpedited() 方法:
val request = OneTimeWorkRequestBuilder《HighPriorityWorker》() .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) .build()WorkManager.getInstance(context).enqueue(request)
通過調(diào)用 setExpedited() 告訴框架該任務(wù)是重要的并且比其他任務(wù)具有更高的優(yōu)先級。請注意,我們在調(diào)用 setExpedited() 方法時傳入了 OutOfQuotaPolicy 參數(shù)。加急任務(wù)受基于應(yīng)用待機(jī)群組 (App Standby Buckets) 的配額限制,當(dāng)您的應(yīng)用嘗試在超出配額的情況下執(zhí)行加急任務(wù)時,WorkManager 會根據(jù) OutOfQuotaPolicy 參數(shù)做出相應(yīng)的行為: 完全放棄加急任務(wù)請求 (DROP_WORK_REQUEST),或者將該加急任務(wù)降級至普通任務(wù) (RUN_AS_NON_EXPEDITED_WORK_REQUEST)。加急任務(wù)很重要,但并不意味著它可以一直執(zhí)行,您需要將配額視為執(zhí)行加急任務(wù)的時間限制。
OutOfQuotaPolicy
https://developer.android.google.cn/reference/androidx/work/OutOfQuotaPolicy
應(yīng)用待機(jī)群組 (App Standby Buckets)
https://developer.android.google.cn/topic/performance/appstandby
WorkManager 2.7 是向后兼容的,可以在 Android 12 之前的系統(tǒng)上運行。當(dāng)在 Android 11 或之前版本的系統(tǒng)上調(diào)用 setExpedited() 時,WorkManager 將默認(rèn)使用前臺服務(wù)代替加急任務(wù)。
想了解 WorkManager 中 setExpedited() API 的實戰(zhàn),請參閱官方文檔:
WorkManager 示例
https://github.com/android/architecture-components-samples/tree/android-s/WorkManagerSample
加急任務(wù)
https://developer.android.google.cn/topic/libraries/architecture/workmanager/how-to/define-work#expedited-jobs
您可以在官方發(fā)布說明中查看 WorkManager 每個版本中變更及優(yōu)化的詳細(xì)列表,以及 WorkManager 2.6 和 WorkManager 2.7 的發(fā)布說明。
WorkManager 2.6
https://developer.android.google.cn/jetpack/androidx/releases/work#2.6.0
WorkManager 2.7
https://developer.android.google.cn/jetpack/androidx/releases/work#2.7.0
責(zé)任編輯:haq
-
Android
+關(guān)注
關(guān)注
12文章
3946瀏覽量
128168 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9367瀏覽量
86273
原文標(biāo)題:在 Android 12 中使用 WorkManager
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Spire.XLS for Android via Java組件說明

如何在Windows中使用MTP協(xié)議
android手機(jī)上emulate應(yīng)用程序的方法
如何在Android上構(gòu)建自定義AI功能
如何在反激式轉(zhuǎn)換器中緩沖FET關(guān)斷電壓

【軟件干貨】Android應(yīng)用進(jìn)程如何保活?

如何在android i2c控制tas5548 ?
如何在反激式拓?fù)?b class='flag-5'>中實現(xiàn)軟啟動

如何在FPGA中實現(xiàn)隨機(jī)數(shù)發(fā)生器

請問esp-idf 5.0如何在運行時調(diào)節(jié)MCPWM的定時器頻率?
請問cmakelists中的變量如何在程序中使用?
如何在PSoC62 Evaluation kit開發(fā)板上運行RT-Thread呢?

評論