您的位置首页>硬件>

如何在Android 12中运行WorkManager

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解如何在Android 12中运行WorkManager问题。Android 12 (API等级31)引入了前台服

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解如何在Android 12中运行WorkManager问题。

Android 12 (API等级31)引入了前台服务启动的限制。除了少数特殊场景,如果你的应用的targetSdkVersion是Android 12或更高的API级别,那么当应用在后台运行时,前台服务就不能再启动了。这意味着,如果应用程序的当前状态不满足在后台启动服务的条件,则在调用setForeground时可能会引发异常。

前台服务开始限制。

https://developer . Android . Google.cn/about/versions/12/前台-服务

特殊场景

https://developer . Android . Google.cn/guide/components/前台-服务#后台-启动-限制-豁免

设置前景

https://developer . Android . Google.cn/reference/androidx/work/list enableworker # setForegroundAsync(androidx . work . foregroundinfo)

反常的

https://developer . Android . Google.cn/reference/Android/app/ForegroundServiceStartNotAllowedException

因此,我们在WorkManager 2.7中做了一些改进,使应用程序可以在遵守后台限制的同时轻松安排重要任务。通过加速任务,应用程序可以轻松运行短时间和高优先级的任务,例如发送聊天消息或向社交网络上传图片。建议使用紧急任务来启动需要立即执行的任务,即使用户将应用程序放在后台也可以继续执行。

紧急任务

https://developer . Android . Google.cn/about/versions/12/前台-服务#加急-作业

要设置紧急任务,您可以通过工作请求的生成器对象调用设置加速()方法:

val请求=OneTimeWorkRequestBuilder 《HighPriorityWorker》()。设置加速(超出报价策略。作为非加速工作请求运行)。build()WorkManager.getInstance(上下文)。入队(请求)

通过调用setquired()告诉框架该任务很重要,并且比其他任务具有更高的优先级。请注意,我们在调用setfasteed()方法时传入了OutOfQuotaPolicy参数。紧急任务受到基于应用程序备用存储桶的配额的限制。当您的应用程序试图执行超出配额的紧急任务时,工作管理器将根据OutOfQuotaPolicy参数采取相应的操作:完全放弃紧急任务请求(DROP_WORK_REQUEST),或将紧急任务降级为普通任务(run _ as _ non _加急_WORK_REQUEST)。紧急任务很重要,但不代表可以一直执行。你需要把定额作为执行紧急任务的时限。

报价策略之外

https://developer . Android . Google.cn/reference/androidx/work/out of quotapolice

应用程序备用桶(应用程序备用桶)。

https://developer . Android . Google.cn/topic/performance/app待机

t-indent:2em;">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

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

.dfma { position: relative; width: 1000px; margin: 0 auto; } .dfma a::after { position: absolute; left: 0; bottom: 0; width: 30px; line-height: 1.4; text-align: center; background-color: rgba(0, 0, 0, .5); color: #fff; font-size: 12px; content:"广告"; } .dfma img { display: block; }
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。