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.6 和 WorkManager 2.7 的釋出說明。
如果您有與 WorkManager 相關的任何功能需求或問題,歡迎在我們公開的問題追蹤器裡提交 issue。
歡迎您 點選這裡 向我們提交反饋,或分享您喜歡的內容、發現的問題。您的反饋對我們非常重要,感謝您的支援!