在 Android 12 中使用 WorkManager

Android 12 (API 級別爲 31) 引入了 前臺服務啓動限制。除少部分 特殊場景 外,如果您的應用的 targetSdkVersion 是 Android 12 或者更高 API 級別的話,應用在後臺運行時將不能再啓動前臺服務。這意味着,如果應用當前狀態不符合後臺啓動服務的條件,調用 setForeground 時可能會拋出 異常

因此,我們在 WorkManager 2.7 中做出了部分改進,使得應用在遵守後臺限制的同時可以輕鬆地安排重要任務。通過 加急任務,應用可以輕鬆地運行 耗時短且高優先級的任務,例如發送一條聊天信息或者往社交網絡上傳一張圖片。推薦使用加急任務來啓動需要立即執行且即使用戶將應用放至後臺也能繼續執行的任務。

如需設置加急任務,可通過 WorkRequest 的 Builder 對象調用 setExpedited() 方法:

val request = OneTimeWorkRequestBuilder<HighPriorityWorker>() 
   .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
      .build()
WorkManager.getInstance(context).enqueue(request)

通過調用 setExpedited() 告訴框架該任務是重要的並且比其他任務具有更高的優先級。請注意,我們在調用 setExpedited() 方法時傳入了 OutOfQuotaPolicy 參數。加急任務受基於 應用待機羣組 (App Standby Buckets) 的配額限制,當您的應用嘗試在超出配額的情況下執行加急任務時,WorkManager 會根據 OutOfQuotaPolicy 參數做出相應的行爲: 完全放棄加急任務請求 (DROP_WORK_REQUEST),或者將該加急任務降級至普通任務 (RUN_AS_NON_EXPEDITED_WORK_REQUEST)。加急任務很重要,但並不意味着它可以一直執行,您需要將配額視爲執行加急任務的時間限制。

WorkManager 2.7 是向後兼容的,可以在 Android 12 之前的系統上運行。當在 Android 11 或之前版本的系統上調用 setExpedited() 時,WorkManager 將默認使用前臺服務代替加急任務。

想了解 WorkManager 中 setExpedited() API 的 實戰,請參閱官方 示例文檔

您可以在官方發佈說明中查看 WorkManager 每個版本中變更及優化的詳細列表,以及 WorkManager 2.6WorkManager 2.7 的發佈說明。

如果您有與 WorkManager 相關的任何功能需求或問題,歡迎在我們公開的問題追蹤器裏提交 issue

歡迎您 點擊這裏 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支持!

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