使用 WorkManager 安排任务 是 Android Jetpack 的一部分。
WorkManager 是持久性工作的推荐解决方案。当工作在应用重启和系统重启后仍然保持计划时,该工作就是持久性的。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 是后台处理的主要推荐 API。
持久性工作类型
WorkManager 处理三种类型的持久性工作
- 立即执行:必须立即开始并在短时间内完成的任务。可以加快执行。
- 长时间运行:可能运行较长时间的任务,可能超过 10 分钟。
- 可延迟:安排在稍后时间启动并可以定期运行的任务。
图 1 概述了不同类型的持久性工作之间的关系。
同样,下表概述了各种工作类型。
类型 | 周期性 | 访问方式 |
---|---|---|
立即执行 | 一次性 | OneTimeWorkRequest 和 Worker 。对于加快执行的工作,请在您的 OneTimeWorkRequest 上调用 |
长时间运行 | 一次性或周期性 | 任何 WorkRequest 或 Worker 。在 Worker 中调用 setForeground() 来处理通知。 |
可延迟 | 一次性或周期性 | PeriodicWorkRequest 和 Worker 。 |
有关如何设置 WorkManager 的更多信息,请参阅 定义您的 WorkRequests 指南。
功能
除了提供更简单且更一致的 API 之外,WorkManager 还具有许多其他关键优势
工作约束
使用 工作约束 声明性地定义运行您的工作的最佳条件。例如,仅在设备处于无计量网络、设备空闲或电池电量充足时运行。
强大的调度功能
WorkManager 允许您 安排工作 以 一次性 或 重复 使用灵活的调度窗口运行。工作也可以被标记和命名,允许您安排唯一、可替换的工作,并一起监控或取消工作组。
已安排的工作存储在内部管理的 SQLite 数据库中,WorkManager 负责确保此工作持续存在并在设备重启后重新安排。
此外,WorkManager 遵守省电功能和最佳实践,例如 休眠模式,因此您无需担心。
快速工作
您可以使用 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 开发者峰会
- WorkManager:基础知识之外,来自 2019 年 Android 开发者峰会
博客
为您推荐
- 注意:当 JavaScript 关闭时显示链接文本
- 应用启动