Android 12 (API 级别为 31) 引入了前台服务启动限制。除少部分特殊场景外,如果您的应用的 targetSdkVersion 是 Android 12 或者更高 API 级别的话,应用在后台运行时将不能再启动前台服务。这意味着,如果应用当前状态不符合后台启动服务的条件,调用 setForeground 时可能会抛出异常。
前台服务启动限制
https://developer.android.google.cn/about/versions/12/foreground-services
特殊场景
https://developer.android.google.cn/guide/components/foreground-services#background-start-restriction-exemptions
setForeground
https://developer.android.google.cn/reference/androidx/work/ListenableWorker#setForegroundAsync(androidx.work.ForegroundInfo)
异常
https://developer.android.google.cn/reference/android/app/ForegroundServiceStartNotAllowedException
因此,我们在 WorkManager 2.7 中做出了部分改进,使得应用在遵守后台限制的同时可以轻松地安排重要任务。通过加急任务,应用可以轻松地运行耗时短且高优先级的任务,例如发送一条聊天信息或者往社交网络上传一张图片。推荐使用加急任务来启动需要立即执行且即使用户将应用放至后台也能继续执行的任务。
加急任务
https://developer.android.google.cn/about/versions/12/foreground-services#expedited-jobs
如需设置加急任务,可通过 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)。加急任务很重要,但并不意味着它可以一直执行,您需要将配额视为执行加急任务的时间限制。
OutOfQuotaPolicy
https://developer.android.google.cn/reference/androidx/work/OutOfQuotaPolicy
应用待机群组 (App Standby Buckets)
https://developer.android.google.cn/topic/performance/appstandby
WorkManager 2.7 是向后兼容的,可以在 Android 12 之前的系统上运行。当在 Android 11 或之前版本的系统上调用 setExpedited() 时,WorkManager 将默认使用前台服务代替加急任务。
想了解 WorkManager 中 setExpedited() API 的实战,请参阅官方文档:
WorkManager 示例
https://github.com/android/architecture-components-samples/tree/android-s/WorkManagerSample
加急任务
https://developer.android.google.cn/topic/libraries/architecture/workmanager/how-to/define-work#expedited-jobs
您可以在官方发布说明中查看 WorkManager 每个版本中变更及优化的详细列表,以及 WorkManager 2.6 和 WorkManager 2.7 的发布说明。
WorkManager 2.6
https://developer.android.google.cn/jetpack/androidx/releases/work#2.6.0
WorkManager 2.7
https://developer.android.google.cn/jetpack/androidx/releases/work#2.7.0
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !