背景
过去,我使用一个前台IntentService来处理各种连续发生的事件。然后当Android 11发布时(Android R,API 30),它被弃用,并建议使用Worker代替,Worker使用setForegroundAsync,因此我就这样做了。
val builder = NotificationCompat.Builder(context,...)...
setForegroundAsync(ForegroundInfo(notificationId, builder.build()))
问题
随着 Android 12 的到来 (Android S, API 31),仅仅一个版本后,现在 setForegroundAsync
被标记为已弃用,我被告知要使用 setExpedited 代替:
* @deprecated Use {@link WorkRequest.Builder#setExpedited(OutOfQuotaPolicy)} and
* {@link ListenableWorker#getForegroundInfoAsync()} instead.
问题在于,我不确定它的工作原理。以前,我们有一个通知,应该向用户显示,因为它正在使用前台服务(至少对于“旧”的Android版本)。现在似乎使用getForegroundInfoAsync来处理这个问题,但我不认为它会用于Android 12 :
在Android S之前,WorkManager代表您管理和运行前台服务,以执行WorkRequest,并显示ForegroundInfo中提供的通知。要随后更新此通知,应用程序可以使用NotificationManager。
从Android S及以上版本开始,WorkManager使用即时作业来管理和运行此WorkRequest。
关于这个问题的另一个线索在于(这里):
从WorkManager 2.7.0开始,您的应用程序可以调用setExpedited()来声明Worker应该使用加速作业。当在Android 12上运行时,此新API将使用加速作业;而在早期的Android版本中,该API则使用前台服务以提供向后兼容性。
他们唯一提供的代码片段是调度本身:
OneTimeWorkRequestBuilder<T>().apply {
setInputData(inputData)
setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
}.build()
即使是OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST的文档看起来也很奇怪:
当应用程序没有任何加速作业配额时,加速工作请求将回退到常规工作请求。
我想做的就是立即、可靠地执行某些操作,而且不间断(或至少可能性最小),并使用操作系统提供的任何东西来执行它。
我不明白为什么要创建setExpedited
。
问题
setExpedited
的工作原理是什么?- 什么是“加速作业配额”?在Android 12中达到这种情况会发生什么?工作程序不会立即执行吗?
setExpedited
与前台服务一样可靠吗?它能够始终立即启动吗?setExpedited
有哪些优点、缺点和限制?为什么应该优先考虑它而不是前台服务?- 这是否意味着当应用程序在Android 12上使用此API时,用户将看不到任何内容?