使用 WorkManager 调度任务
Android Jetpack 的一部分。
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度,便是持久性的工作。由于大多数后台处理操作都是通过持久性工作完成的,因此 WorkManager 是适用于后台处理操作的主要推荐 API。
持久性工作的类型
WorkManager 可处理三种类型的持久性工作:
- 立即执行:必须立即开始且很快就完成的任务,可以加急。
- 长时间运行:运行时间可能较长(有可能超过 10 分钟)的任务。
- 可延期执行:延期开始并且可以定期运行的预定任务。
图 1 大致表明了不同类型的持久性工作彼此之间的关系。
同样,下表大致列出了各种工作类型。
类型 | 周期 | 使用方式 |
---|---|---|
立即 | 一次性 | One 和 Worker 。
如需处理加急工作,请对 OneTimeWorkRequest 调用 |
长期运行 | 一次性或定期 | 任意 Work 或 Worker 。在工作器中调用 set 来处理通知。
|
可延期 | 一次性或定期 | Periodic 和 Worker 。
|
如需详细了解如何设置 WorkManager,请参阅定义您的 WorkRequest 指南。
功能
除了具备更为简单且一致的 API 之外,WorkManager 还具备许多其他关键优势:
工作约束
使用工作约束明确定义工作运行的最佳条件。例如,仅在设备采用不按流量计费的网络连接时、当设备处于空闲状态或者有足够的电量时运行。
强大的调度
WorkManager 允许您使用灵活的调度窗口调度工作,以运行一次性或重复工作。您还可以对工作进行标记或命名,以便调度唯一的、可替换的工作以及监控或取消工作组。
已调度的工作存储在内部托管的 SQLite 数据库中,由 WorkManager 负责确保该工作持续进行,并在设备重新启动后重新调度。
此外,WorkManager 遵循低电耗模式等省电功能和最佳做法,因此您在这方面无需担心。
加急工作
您可以使用 WorkManager 调度需在后台立即执行的工作。您应该使用加急工作来处理对用户来说很重要且会在几分钟内完成的任务。
灵活的重试政策
有时工作会失败。WorkManager 提供了灵活的重试政策,包括可配置的指数退避政策。
工作链
对于复杂的相关工作,您可以使用直观的接口将各个工作任务串联起来,这样您便可以控制哪些部分依序运行,哪些部分并行运行。
val continuation = WorkManager.getInstance(context)
.beginUniqueWork(
Constants.IMAGE_MANIPULATION_WORK_NAME,
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest.from(CleanupWorker::class.java)
).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
.then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
.then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
.then(
if (save) {
workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
} else /* upload */ {
workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
}
)
WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();
对于每项工作任务,您可以定义工作的输入和输出数据。将工作串联在一起时,WorkManager 会自动将输出数据从一个工作任务传递给下一个工作任务。
内置线程互操作性
WorkManager 无缝集成 Coroutines 和 RxJava,让您可以插入自己的异步 API,非常灵活。
使用 WorkManager 保证工作可靠性
WorkManager 适用于需要可靠运行的工作,即使用户导航离开屏幕、退出应用或重启设备也不影响工作的执行。例如:
- 向后端服务发送日志或分析数据。
- 定期将应用数据与服务器同步。
WorkManager 不适用于那些可在应用进程结束时安全终止的进程内后台工作。它也并非对所有需要立即执行的工作都适用的通用解决方案。请查看后台处理指南,了解哪种解决方案符合您的需求。
与其他 API 的关系
虽然协程是适合某些用例的推荐解决方案,但您不应将其用于持久性工作。请务必注意,协程是一个并发框架,而 WorkManager 是一个持久性工作库。同样,AlarmManager 仅适合用于时钟或日历。
API | 推荐使用场景 | 与 WorkManager 的关系 |
---|---|---|
Coroutines | 所有不需要持久的异步工作。 | 协程是在 Kotlin 中退出主线程的标准方式。不过,它们在应用关闭后会释放内存。对于持久性工作,请使用 WorkManager。 |
AlarmManager | 仅限闹钟。 | 与 WorkManager 不同,AlarmManager 会使设备从低电耗模式中唤醒。因此,它在电源和资源管理方面来讲并不高效。AlarmManager 仅适合用于精确闹钟或通知(例如日历活动)场景,而不适用于后台工作。 |
取代已废弃的 API
WorkManager API 是一个适合用来替换先前的 Android 后台调度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler)的推荐组件。
使用入门
如需开始在您的应用中使用 WorkManager,请查看入门指南。
其他资源
如需详细了解 WorkManager
,请参阅以下资源。
示例
Learn how this app was designed and built in the design case study, architecture learning journey and modularization learning journey.
This is the repository for the Now in Android app. It is a work in progress 🚧.
Now in Android is a fully functionalNow in Android App
视频
- Workmanager - MAD 技巧(系列视频)
- 使用 WorkManager(2018 年 Android 开发者峰会)
- WorkManager:深入探索高级知识(2019 年 Android 开发者峰会)