持久性工作 Android Jetpack 的一部分。
当工作在应用重启和系统重新启动后仍保持调度状态时,它就是持久性的。WorkManager 是持久性工作的推荐解决方案。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 也是通用后台处理的主要推荐 API。
持久性工作类型
WorkManager 处理三种类型的持久性工作
- 即时:必须立即开始并很快完成的任务。可以加快执行。
- 长时间运行:可能运行时间较长的任务,可能超过 10 分钟。
- 可延迟:在稍后时间开始并可以周期性运行的调度任务。
图 1 概述了不同类型的持久性工作之间的关系。
同样,下表概述了各种工作类型。
类型 | 周期性 | 如何访问 |
---|---|---|
即时 | OneTimeWorkRequest 和 Worker 。对于加快的工作,请在 OneTimeWorkRequest 上调用 setExpedited() 。 |
OneTimeWorkRequest 和 Worker 。对于加急工作,请在您的 OneTimeWorkRequest 上调用 setExpedited() 。 |
长时间运行 | 一次性或周期性 | 任何 WorkRequest 或 Worker 。在 Worker 中调用 setForeground() 来处理通知。 |
可延迟 | 一次性或周期性 | PeriodicWorkRequest 和 Worker 。 |
有关如何设置 WorkManager 的更多信息,请参阅定义您的工作请求指南。
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,视频系列
- 来自 2018 年 Android 开发者峰会的使用 WorkManager
- 来自 2019 年 Android 开发者峰会的WorkManager:超越基础