使用 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 会将设备从 Doze 模式唤醒。因此,它在功耗和资源管理方面效率不高。只将其用于精确的警报或通知,例如日历事件——而不是后台工作。 |
替换已弃用的 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 关闭时,链接文本将显示
- 应用启动