0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Android 12中运行WorkManager

谷歌开发者 来源:Android开发者 作者:Android 2021-10-28 11:18 次阅读

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125635
  • 服务器
    +关注

    关注

    12

    文章

    8113

    浏览量

    82499

原文标题:在 Android 12 中使用 WorkManager

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    求助,如何在运行过程监控变量实时的值?

    何在运行过程监控变量实时的值? 在我点击 " resume " 之前,可以看到这个值。 我点击 " resume " 后,看不到这个值。
    发表于 01-22 07:39

    何在 CFD 设计中利用网格维护几何形状并减少运行时间?

    何在 CFD 设计中利用网格维护几何形状并减少运行时间?
    的头像 发表于 11-24 17:07 211次阅读
    如<b class='flag-5'>何在</b> CFD 设计中利用网格维护几何形状并减少<b class='flag-5'>运行</b>时间?

    i.MX8 Android Automotive12 修改开机 logo

    在 i.MX8 的 Android Automotive12 BSP 版本中,默认的是 NXP 的开机 LOGO 显示,如果我们想要更改显示自己的 logo,该如何配置?本篇文件给大家介绍如何更改 i.MX8 Android A
    的头像 发表于 09-04 16:42 926次阅读
    i.MX8 <b class='flag-5'>Android</b> Automotive<b class='flag-5'>12</b> 修改开机 logo

    何在Keil uVision3 IDE基于ARM开发板调试和运行程序

    本应用笔记介绍如何在Keil uVision3 IDE基于ARM的开发板上调试和运行程序。 与更传统的JTAG协议转换器(如多ICE)不同,本文重点介绍了使用带有JTAG编程加密狗的H-JTAG
    发表于 08-29 06:21

    多个任务程序如何在RTX实时操作系统运行

    应用程序: 演示多个任务程序如何在 RTX(实时eXective) 实时操作系统运行 。 BSP 版本: NUC230/240 Series BSP v3.01.002 硬件: NuTiny
    发表于 08-22 08:18

    【今晚开播】社区说 | 深入探索 Android 技术的演进与创新

    Android 在不断地迭代升级的过程中,涌现出很多创新的设计理念,本次社区说的嘉宾们会给大家带来 Compose 跨平台、ART 虚拟机、DaggerHilt 原理、WorkManager 等核心
    的头像 发表于 06-29 18:40 233次阅读
    【今晚开播】社区说 | 深入探索 <b class='flag-5'>Android</b> 技术的演进与创新

    社区说 | 深入探索 Android 技术的演进与创新

    Android 在不断地迭代升级的过程中,涌现出很多创新的设计理念,本次社区说的嘉宾们会给大家带来 Compose 跨平台、ART 虚拟机、DaggerHilt 原理、WorkManager 等核心
    的头像 发表于 06-27 17:40 170次阅读
    社区说 | 深入探索 <b class='flag-5'>Android</b> 技术的演进与创新

    Android12 系统开发记录-迅为RK3588使用ADB工具

    如下所示:  在 Android 设备上运行 shell 终端,用命令行操作  管理模拟器或设备的端口映射  电脑和设备之间相互拷贝文件  APK 调试和安装 adb 工具在网盘资料
    发表于 06-13 11:30

    请问如何在Android 9以上的设备上正常使用这个功能?

    请问如何在Android 9以上的设备上正常使用这个功能?好像是https或者http引起的。 谢谢
    发表于 05-25 08:30

    运行带有Xen Hypervisor和预建linux Android auto的2操作系统,如何配置显示?

    ) 和 Android Automotive OS (android_p9.0.0_2.3.5-auto_image_8qmek) 我成功地能够运行 Domain-0 和 DomU。 我正在用我的嵌入式
    发表于 05-24 07:09

    何在AUTOSAR OS系统运行时使用事件Event呢?

    在AUTOSAR OS系统中,事件用于向任务发送信号信息。本节解释事件是什么,如何配置它们以及如何在运行时使用它们。
    发表于 05-22 10:04 1441次阅读
    如<b class='flag-5'>何在</b>AUTOSAR OS系统<b class='flag-5'>运行</b>时使用事件Event呢?

    iMX8QM EVK Android Automotive OS 12蓝牙驱动程序问题如何解决?

    我添加了包含在 Android Automotive OS 10(5.4.24) 并在 Android Automotive OS 12(5.15.32)
    发表于 05-18 08:02

    何在python实现ESP TOUCH协议?

    设备连接到路由器。 有人能告诉我如何在 python 实现 ESP TOUCH 协议吗?这样所有模块连同树莓派都可以从一个应用程序同时配置。
    发表于 05-17 08:20

    如何将memtool集成到i.MX8MM Android 12平台

    Memtool 是一个有用的调试工具,可以读/写一些 i.MX 寄存器。Linux 默认支持,Android 不支持。 本文介绍如何将 memtool 集成到 i.MX8MM Android 12 平台中,这在其他 i.MX
    发表于 05-16 06:56

    何在Arduino ESP8266和Android应用程序中正确地实现WebSockets?

    、C# 等方面。我没有 Android 应用程序开发经验,我也是 ESP8266 的新手。 我想在自建 Android 应用程序和我的 ESP8266 之间建立 我正在阅读一些帖子和教程并得
    发表于 04-28 08:42