背景
过去,我使用前台的IntentService来处理接踵而至的各种事件。然后它在 Android 11 到来时被弃用(Android R,API 30),据说它更喜欢使用使用setForegroundAsync的 Worker,所以我这样做了。
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 应该使用加急作业。此新 API 在 Android 12 上运行时使用加速作业,并且该 API 在早期版本的 Android 上使用前台服务来提供向后兼容性。
他们拥有的唯一片段是调度本身:
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 时用户将看不到任何内容?