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

    文章

    4035

    浏览量

    134475
  • 服务器
    +关注

    关注

    14

    文章

    10353

    浏览量

    91742

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Google正式发布LLM评测基准Android Bench

    LLM 在 Android 开发任务的表现。现在,我们发布了 Android Bench 的首个版本,这是 Google 官方专门针对 Android 开发打造的 LLM 排行榜。
    的头像 发表于 03-14 16:00 1880次阅读
    Google正式发布LLM评测基准<b class='flag-5'>Android</b> Bench

    RK3399 Android12自动调节屏幕亮度问题排查与解决

    在嵌入式设备开发,屏幕自动亮度调节功能直接影响用户体验与功耗控制。近期在 RK3399 芯片 + Android12 系统的设备上,遇到了自动亮度调节的异常问题 —— 系统自动调节时亮度最低只能
    的头像 发表于 02-04 17:36 1769次阅读
    RK3399 <b class='flag-5'>Android12</b>自动调节屏幕亮度问题排查与解决

    深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c

    Bootloader是Android设备启动的第一道“关卡”,负责初始化硬件、加载系统镜像并完成内核启动的前置准备。在基于U-Boot的Android设备android
    的头像 发表于 01-09 10:58 1416次阅读
    深入解析RK平台<b class='flag-5'>Android</b>/Linux Bootloader核心文件:<b class='flag-5'>android</b>_bootloader.c

    何在DGX Spark上运行NVIDIA Omniverse

    首先感谢 Vigor 同学第一时间的分享,以下是具体如何在 DGX Spark 上运行 Omniverse 的方法。
    的头像 发表于 12-17 10:13 912次阅读
    如<b class='flag-5'>何在</b>DGX Spark上<b class='flag-5'>运行</b>NVIDIA Omniverse

    何在VS code配置Zephyr集成开发环境

    上一篇文章介绍了如何在VS code中使用瑞萨官方插件为RA芯片创建项目与项目调试,相信大家对RA在VS code的开发有了基础的了解。
    的头像 发表于 11-05 14:46 1766次阅读
    如<b class='flag-5'>何在</b>VS code<b class='flag-5'>中</b>配置Zephyr集成开发环境

    何在 buildroot 的 rootfs 显示当前目录?

    何在 buildroot 的 rootfs 显示当前目录?
    发表于 09-03 07:02

    何在裸机环境运行KleidiAI微内核

    探索如何在裸机环境运行 KleidiAI 内核,并通过测试多款 C/C++ 编译器,以确定如何能更高效地生成代码。
    的头像 发表于 08-08 15:16 3999次阅读
    如<b class='flag-5'>何在</b>裸机环境<b class='flag-5'>中</b><b class='flag-5'>运行</b>KleidiAI微内核

    技术分享 | RK3568 Android预安装应用

    很多客户在使用安卓系统时希望自己的业务APP能够第一时间开机启动,并且内置在系统当中。今天就以我司IAC-RK3568-Kit为例,分享如何在Android11系统内置自己的业务APP。购买我司
    的头像 发表于 08-06 17:23 960次阅读
    技术分享 | RK3568 <b class='flag-5'>Android</b>预安装应用

    Android Studio的Gemini全面支持Dart和Flutter开发

    Android Studio 创建 Android 应用的 Flutter 开发者将迎来一次重大的飞跃: Android Studio
    的头像 发表于 08-06 13:52 1507次阅读
    <b class='flag-5'>Android</b> Studio<b class='flag-5'>中</b>的Gemini全面支持Dart和Flutter开发

    Android 16更新亮点介绍

    应用Android 用户提供更新,以及 6 月份的 Pixel Drop。我们还总结了所有 Google I/O 的相关更新,帮助 Android 开发者构建出色的自适应 Androi
    的头像 发表于 07-05 11:37 3914次阅读

    何在树莓派上安装并运行 Arduino 集成开发环境!

    ,我们将介绍如何在树莓派上安装并运行ArduinoIDE。所需物品要在树莓派上运行ArduinoIDE,你需要以下组件:配备适当电源的树莓派4开发板HDMI显示器或电
    的头像 发表于 07-01 17:41 4563次阅读
    如<b class='flag-5'>何在</b>树莓派上安装并<b class='flag-5'>运行</b> Arduino 集成开发环境!

    何在k230上运行OpenCV的代码?

    何在k230上运行OpenCV的代码
    发表于 06-17 06:06

    Android In Docker Magisk 的部署与简单应用指南

    Magisk—系统级“魔法面具”Magisk(MagicMask)是由开发者topjohnwu开发的开源Android框架,自2016年发布以来已成为最受欢迎的Android系统修改工具之一。其核心
    的头像 发表于 05-28 16:42 2473次阅读
    <b class='flag-5'>Android</b> In Docker <b class='flag-5'>中</b> Magisk 的部署与简单应用指南

    何在Android设备上安装Cyusb3014芯片驱动?

    1.如何在Android设备上安装Cyusb3014芯片驱动? 我们在 Windows 上有 FX3 驱动程序 SDK。 2.如何在Android系统上下载固件到芯片中?
    发表于 05-15 07:23

    Android Studio的Gemini支持多模态输入功能

    在开发生命周期的每个阶段,Android Studio 的 Gemini 都已成为您的 AI 助手,助您更轻松地构建高质量的应用。我们很高兴地与您分享一项重大升级:Android Studio
    的头像 发表于 05-14 16:44 1289次阅读