使用 WorkManager 安排任务 是 Android Jetpack 的一部分。
WorkManager 是持久性工作的推荐解决方案。当工作在应用重启和系统重启后仍然保持计划时,它就是持久性的。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 是后台处理的主要推荐 API。
持久性工作类型
WorkManager 处理三种类型的持久性工作
- 立即执行:必须立即开始并很快完成的任务。可以加快处理速度。
- 长时间运行:可能运行较长时间的任务,潜在地超过 10 分钟。
- 可延迟:在稍后时间启动并可以定期运行的计划任务。
图 1 概述了不同类型的持久性工作之间的关系。
同样,下表概述了各种工作类型。
类型 | 周期性 | 访问方式 |
---|---|---|
立即执行 | 一次性 | OneTimeWorkRequest 和 Worker 。对于加快处理速度的工作,请在您的 OneTimeWorkRequest 上调用 |
长时间运行 | 一次性或周期性 | 任何 WorkRequest 或 Worker 。在 Worker 中调用 setForeground() 来处理通知。 |
可延迟 | 一次性或周期性 | PeriodicWorkRequest 和 Worker 。 |
有关如何设置 WorkManager 的更多信息,请参阅 定义您的 WorkRequest 指南。
功能
除了提供更简单和更一致的 API 之外,WorkManager 还具有一些其他关键优势
工作约束
使用 工作约束 声明性地定义工作运行的最佳条件。例如,仅在设备处于非计量网络、设备空闲或电池电量充足时运行。
强大的调度
WorkManager 允许您安排工作 使用灵活的调度窗口一次性 或重复运行。工作也可以被标记和命名,允许您安排独特、可替换的工作并一起监控或取消工作组。
计划中的工作存储在内部管理的 SQLite 数据库中,WorkManager 负责确保此工作持续存在并在设备重启后重新安排。
此外,WorkManager 遵守省电功能和最佳实践,例如 Doze 模式,因此您无需担心它。
快速工作
您可以使用 WorkManager 安排后台执行的立即工作。您应该将 快速工作 用于对用户来说很重要的任务,并且在几分钟内完成的任务。
灵活的重试策略
有时工作会失败。WorkManager 提供 灵活的重试策略,包括可配置的 指数退避策略。
工作链
对于复杂的相关工作,使用允许您控制哪些部分顺序运行以及哪些部分并行运行的直观界面 将各个工作任务链接在一起。
Kotlin
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) } )
Java
WorkManager.getInstance(...) .beginWith(Arrays.asList(workA, workB)) .then(workC) .enqueue();
对于每个工作任务,您可以定义该工作的输入和输出数据。当将工作链接在一起时,WorkManager 会自动将输出数据从一个工作任务传递到下一个工作任务。
内置线程互操作性
WorkManager 无缝集成 协程 和 RxJava,并提供灵活地插入您自己的异步 API。
将 WorkManager 用于可靠的工作
WorkManager 旨在用于即使用户离开屏幕、应用退出或设备重启也需要**可靠运行**的工作。例如:
- 将日志或分析数据发送到后端服务。
- 定期将应用程序数据与服务器同步。
WorkManager 不适用于如果应用程序进程消失可以安全终止的进程内后台工作。它也不是所有需要立即执行的工作的通用解决方案。请查看后台处理指南以了解哪个解决方案满足您的需求。
与其他 API 的关系
虽然协程是某些用例的推荐解决方案,但不应将其用于持久性工作。需要注意的是,协程是一个并发框架,而 WorkManager 是一个用于持久性工作的库。同样,只应将 AlarmManager 用于时钟或日历。
API | 推荐用于 | 与 WorkManager 的关系 |
---|---|---|
协程 | 所有不需要持久化的异步工作。 | 协程是 Kotlin 中离开主线程的标准方法。但是,一旦应用程序关闭,它们就会释放内存。对于持久性工作,请使用 WorkManager。 |
AlarmManager | 仅限闹钟。 | 与 WorkManager 不同,AlarmManager 会将设备从休眠模式唤醒。因此,它在节电和资源管理方面效率不高。仅将其用于精确的闹钟或通知(例如日历事件)——而不是后台工作。 |
替换已弃用的 API
WorkManager API 是所有以前的 Android 后台调度 API 的推荐替代方案,包括FirebaseJobDispatcher、GcmNetworkManager 和 Job Scheduler。
入门
查看入门指南,开始在您的应用中使用 WorkManager。
其他资源
有关WorkManager
的更多信息,请参阅以下资源。
示例
视频
- Workmanager - MAD Skills,视频系列
- 使用 WorkManager,来自 2018 年 Android Dev Summit
- WorkManager:基础知识之外,来自 2019 年 Android Dev Summit
博客
为您推荐
- 注意:关闭 JavaScript 时将显示链接文本
- 应用启动