持久性工作   作为 Android Jetpack 的一部分。

工作在应用重启和系统重启期间保持计划状态时,则为持久性工作。 WorkManager 是推荐的持久性工作解决方案。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 也是一般情况下推荐使用的主要后台处理 API。

持久性工作的类型

WorkManager 处理三种类型的持久性工作

  • 立即执行:必须立即开始并尽快完成的任务。可以加快执行速度。
  • 长时间运行:可能运行更长时间的任务,可能超过 10 分钟。
  • 可延迟:在稍后时间开始并且可以定期运行的计划任务。

图 1 说明了不同类型的持久性工作之间的关系。

Persistent work may be immediate, long running, or deferrable
图 1:持久性工作的类型。

同样,下表概述了各种工作类型。

类型 周期性 如何访问
立即执行 一次性 OneTimeWorkRequestWorker。对于需要加快执行速度的工作,请在您的 OneTimeWorkRequest 上调用 setExpedited()
长时间运行 一次性或定期 任何 WorkRequestWorker。在 Worker 中调用 setForeground() 以处理通知。
可延迟 一次性或定期 PeriodicWorkRequestWorker

有关如何设置 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 的推荐替换,包括 FirebaseJobDispatcherGcmNetworkManagerJobScheduler

入门

查看 入门指南,开始在您的应用程序中使用 WorkManager。

其他资源

以下部分提供了一些其他资源。

视频

博客

示例