[译] WorkManager 简介

简介: 这篇文章是 WorkManager 系列中的第一篇。我们将探讨 WorkManager 的基础知识,如何以及何时使用它,以及幕后发生了什么。然后我们将深入研究更复杂的用例。

[译] WorkManager 简介
原文地址:Introducing WorkManager
原文作者:Pietro Maggi
译文出自:掘金翻译计划
本文永久链接:github.com/xitu/gold-m…
译者:Rickon
校对者:DevMcryYu


image.png

插图来自 Virginia Poltrack

Android 系统处理后台工作有很多注意事项和最佳实践,详见 Google’s Power blog post series。其中一个反复出现的调用是一个名为 WorkManager 的 Android Jetpack 库,它扩展了 JobScheduler 框架 API 的功能,并支持 Android 4.0+(API 14+)。WorkManager 测试版今天刚刚发布!

这篇文章是 WorkManager 系列中的第一篇。我们将探讨 WorkManager 的基础知识,如何以及何时使用它,以及幕后发生了什么。然后我们将深入研究更复杂的用例。

WorkManager 是什么?

WorkManager 是 Android 架构组件之一,也是 Android Jetpack 的一部分,是一个关于如何构建现代 Android 应用程序的新见解。

WorkManager 是一个 Android 库,在满足工作的约束条件时运行可延迟的后台工作。

WorkManager 适用于需要保障的任务,即使应用程序退出,系统也会运行它们。

换句话说,WorkManager 提供了一个电池友好的 API,它封装了 Android 后台行为限制多年来的演变。这对于需要执行后台任务的 Android 应用程序至关重要!

什么时候使用 WorkManager

无论应用程序进程是否存在,WorkManager 都会处理在满足各种约束条件时需要运行的后台工作。后台工作可以在应用程序位于后台、前台或者应用在前台打开即将转到后台的时候启动。无论应用程序在做什么,后台工作都应该继续进行,或者在 Android 终止其进程时重启其后台工作。

关于 WorkManager 的一个常见误解是它需要在“后台”线程中运行,但不需要在进程死亡时存活。事实并非如此。这种用例还有其他解决方案,如 Kotlin 的协程,ThreadPools 或 RxJava 等库。你可以在后台处理指南中找到有关此用例的更多信息。

有许多不同的情况下,你需要运行后台工作,因此需要使用不同的解决方案来运行后台工作。这篇关于后台运行的博客文章提供了很多关于何时使用 Workmanager 的有用信息。请看博客中的此图表:

image.png

图解来自 Android 中的现代后台运行

对于 WorkManager,最适合处理的是必须完成并且可以延迟的后台工作。

首先,问问你自己:

  • 这个任务需要完成吗? 如果应用程序被用户关闭了,是否仍需要完成任务?一个例子是带有远程同步的笔记应用程序;每次你写完一个笔记,你就会期望该应用程序将你的笔记与后端服务器同步。即使您切换到另一个应用程序并且操作系统需要关闭应用程序以回收一些内存。即使重新启动设备也会发生这种情况。WorkManager 能够确保任务完成。
  • 这个任务可以延迟吗? 我们可以稍后运行任务,还是只在现在运行才可以用?如果任务可以稍后运行,那么它是可延迟的。回到前面的例子,立即同步你的笔记会很好,但是如果不能立即同步而是稍后进行的话也没什么大问题。WorkManager 尊重操作系统后台限制,并尝试以电池高效的方式运行你的工作。

因此,作为指导原则,WorkManager 适用于需要确保系统将运行它们的任务,即使应用程序退出也是如此。它不适用于需要立即执行或需要在确切时间执行的后台工作。如果你需要在准确的时间执行工作(例如闹钟或事件提醒),请使用 AlarmManager。对于需要立即执行但长时间运行的工作,你通常需要确保在前台执行工作;是否通过限制执行到前台(在这种情况下工作不再是真正的后台工作)或使用前台服务。

  • 当你需要在更复杂的场景中触发一些后台工作时,WorkManager 可以并且应该与其他 API 配对使用:
  • 如果你的服务器触发了工作,WorkManager 可以与 Firebase Cloud Messaging 配对使用。
    如果你正在使用广播接收器监听广播,然后需要触发长时间运行的工作,那么你可以使用 WorkManager。请注意,WorkManager 支持许多通常作为广播传播的常见 Constraints — 在这些情况下,你不需要注册自己的广播接收器。

为什么要用 WorkManager?

WorkManager 运行后台工作,同时能够为你处理电池和系统健康的兼容性问题和最佳实践。

此外,你可以使用 WorkManager 安排定时任务和复杂的从属任务链:后台工作可以并行或顺序执行,你可以在其中指定执行顺序。WorkManager 无缝地处理任务之间的输入和输出传递。

你还可以设置后台任务运行时间的标准。例如,如果设备没有网络连接,则没有理由向远程服务器发出 HTTP 请求。因此,您可以设置约束条件,该任务只能在网络连接时运行。

作为保证执行的一部分,WorkManager 负责在设备或应用程序重启时保持工作。你也可以轻松地定义重试策略如果你的工作已停止并且您想稍后重试。

最后,WorkManager 允许你观察工作请求的状态,以便你可以更新 UI。

总而言之,WorkManager 提供了以下好处:

  • 处理不同系统版本的兼容性
  • 遵循系统健康最佳实践
  • 支持异步一次性和周期性任务
  • 支持带输入/输出的链式任务
  • 允许你设置在任务运行时的约束
  • 即使应用程序或设备重启,也可以保证任务执行

让我们看一个具体的例子,我们构建一个将过滤器应用于图像的并发任务管道。然后将结果发送到压缩任务,然后发送到上传任务。

我们可以为这些任务定义一组约束,并指定何时可以执行它们:

image.png

带有约束的任务链示例

所有这些 workers 都定义了一个精确的序列:我们不知道过滤图像的顺序,但我们知道只有在所有过滤器工作完成后,Compress 工作才会启动。

WorkManager 调度程序的工作原理

为了确保兼容性达到 API 14 级别,WorkManager 根据设备 API 级别选择适当的方式来安排后台任务。WorkManager 可能使用 JobScheduler 或 BroadcastReceiver 和 AlarmManager 的组合。

image.png

WorkManager 如何确定要使用的调度程序

WorkManager 准备好用于生产了吗?

WorkManager 现在处于测试阶段。这意味着在此主要修订版中不会有重大的 API 变更。

当 WorkManager 稳定版本发布时,它将是运行后台任务的首选方式。 因此,这是开始使用 WorkManager 并帮助改进它的好时机!

感谢 Lyla Fujiwara。

WorkManager 相关资源

官方文档

Reference guide

WorkManager 1.0.0-beta01 Release notes

Codelab

源代码 (part of AOSP)

IssueTracker

StackOverflow 网站上的 WorkManager 相关问题

Google’s Power blog post series

感谢 Florina Munt、Ben Weiss 和 Lyla Fujiwara.

目录
相关文章
|
11月前
|
监控 Oracle 关系型数据库
oratop的使用简介
oratop是采用类似top命令的方式实时监控oracle数据库,包括rac和non-rac数据库
|
存储 编解码
H264简介
H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,而它的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer),其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
H264简介
|
安全 算法 网络安全
虚拟专用网简介
本文重点讲解虚拟专用网的理论知识,后续文章对具体虚拟专用网进行讲解(包括原理和配置),欢迎持续关注和订阅专栏。
944 0
|
API C++
exosip 和 pjsip 简介
oSIP  oSIP的开发开始于2000年7月,第一个版本在2001年5月发 布,到现在已经发展到3.x了。它采用ANSI C编写,而且结 构简单小巧,所以速度特别快,它并不提供高层的SIP会话 控制API,它主要提供一些解析SIP/SDP消息的API和事务处理 的状态机,oSIP的作者还开发了基于oSIP的UA lib:exosip和 proxy server lib:partysip.
3841 0
|
网络协议 开发工具 Android开发
AndroidDevTools简介
来源:http://www.androiddevtools.cn/ Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.
2859 0
|
网络协议 机器人 Java
ROSBridge简介以及理解使用(上)
ROSBridge简介以及理解使用(上)
2261 0
ROSBridge简介以及理解使用(上)
|
XML 分布式计算 算法
Rosetta | Rosetta简介
Rosetta | Rosetta简介
770 0
Rosetta | Rosetta简介
|
索引 容器
NSIndexSet 简介
NSIndexSet (以及它的可修改子类, NSMutableIndexSet) 是一个排好序的,无重复元素的整数集合。它看上去有点像 支持离散整数的 NSRange .它能用于快速查找特定范围的值的索引,也能用于快速计算交集, 同时,Foundation collection class 提供了很多好用的方法,方便你使用 NSIndexSet.
254 0
NSIndexSet 简介
|
数据安全/隐私保护
叶帆密码箱简介
叶帆密码箱一个纯绿色软件,小巧实用,可以保存各种网络账号,银号帐户,Email信息 等等,此外还可以直接打开链接网址,直接通过热键发送登录信息,方便简洁
696 0
|
JavaScript 前端开发 C++
cheerp 简介
这个文章主要介绍了为什么要用cheerp技术以及和其他对标的技术对比,他的闪光点在哪里。 WebAssembly 是一种中间码用于加速浏览器端应用,目前有多种语言可以编译或者交叉到这种格式。当然这个不是本文的内容,详细了解请移步 wasm官网 目前支持: cc++是官方推荐的方式,详细使用见文档;其他语言 AssemblyScript:语法和 TypeScript 一致,对前端来说学习成本低,为前端编写 WebAssembly 最佳选择; Rust:语法复杂、学习成本高,对前端来说可能会不适应。
2653 0