持久性工作 作为 Android Jetpack 的一部分。
工作在应用重启和系统重启期间保持计划状态时,则为持久性工作。 WorkManager 是推荐的持久性工作解决方案。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 也是一般情况下推荐使用的主要后台处理 API。
持久性工作的类型
WorkManager 处理三种类型的持久性工作
- 立即执行:必须立即开始并尽快完成的任务。可以加快执行速度。
- 长时间运行:可能运行更长时间的任务,可能超过 10 分钟。
- 可延迟:在稍后时间开始并且可以定期运行的计划任务。
图 1 说明了不同类型的持久性工作之间的关系。
同样,下表概述了各种工作类型。
类型 | 周期性 | 如何访问 |
---|---|---|
立即执行 | 一次性 | OneTimeWorkRequest 和 Worker 。对于需要加快执行速度的工作,请在您的 OneTimeWorkRequest 上调用 setExpedited() 。 |
长时间运行 | 一次性或定期 | 任何 WorkRequest 或 Worker 。在 Worker 中调用 setForeground() 以处理通知。 |
可延迟 | 一次性或定期 | PeriodicWorkRequest 和 Worker 。 |
有关如何设置 WorkManager 的更多信息,请参阅 定义您的 WorkRequests 指南。
WorkManager 功能
除了提供更简单、更一致的 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
和 JobScheduler
。
入门
查看 入门指南,开始在您的应用程序中使用 WorkManager。
其他资源
以下部分提供了一些其他资源。
视频
- Workmanager - MAD Skills,视频系列
- 使用 WorkManager,来自 2018 年 Android 开发者峰会
- WorkManager:超越基础,来自 2019 年 Android 开发者峰会