![](/img/trans.png)
[英]Android Workmanager, expedited work show notification even if app is already in foreground
[英]Android 12 expedited job notification
將手機升級到 Android 12 后,我開始在加急工作中出現一些意外行為。 那是我的代碼:
val workRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(UNIQUE_WORK_NAME, ExistingWorkPolicy.REPLACE, workRequest)
而且我還覆蓋了getForegroundInfo()
以返回ForegroundInfo
實例。
在 Android < 12 上,我的工作工作正常:它運行時間很長,當它開始時,通知顯示在通知樹中,並且工作完成。
現在,使用 Android 12 我看不到任何通知圖標,如果我關閉屏幕,則作業會在一分鍾內被取消。 並立即重新啟動。
如果我在doWork()
方法中顯式調用setForeground()
(我不知道有什么區別),它會稍微改變行為:通知開始顯示(由於某種原因不是立即顯示)但它會在一段時間后消失,當作業仍在運行時。 作業本身不會被取消。
這是什么意思呢? 我做錯了嗎? 我想要的只是通過通知啟動長期運行的加急工作。
您是否在 Worker class 中覆蓋了getForegroundInfo()
? 根據文檔:
如果您想請求任務作為加急作業運行,任何 ListenableWorker 都必須實現 getForegroundInfo 方法
如果我在 doWork() 方法中顯式調用 setForeground() (我不知道有什么區別),它會稍微改變行為:
https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running
ListenableWorker 現在支持 setForegroundAsync() API,CoroutineWorker 支持暫停 setForeground() API。 這些 API 允許開發人員指定此 WorkRequest 是重要的(從用戶的角度來看)還是長期運行的。
在 Android < 12 上,我的工作工作正常:它運行時間很長,當它開始時,通知顯示在通知樹中,並且工作完成。
為了保持加急作業的向后兼容性,WorkManager可能會在早於 Android 12 的平台版本上運行前台服務。前台服務可以向用戶顯示通知。
以 Android 12 或更高版本為目標時,您可以通過相應的 setForeground 方法使用前台服務。
https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work#worker https://developer.android.com/static/images/guide/background/workmanager_main.svg
工人們不知道他們正在做的工作是否加急。 但是當 WorkRequest 被加速時,工作人員可以在 Android 的某些版本上顯示通知。
為此,WorkManager 提供了 getForegroundInfoAsync() 方法,您必須實現該方法,以便 WorkManager 可以在必要時為您顯示啟動 ForegroundService 的通知。
長話短說-有很多可能,可以等等。您需要做的是調試 JobScheduler 並弄清楚到底發生了什么,然后嘗試找出原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.