持久性工作   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 的更多信息,请参阅 定义您的工作请求 指南。

WorkManager 功能

除了提供更简单、更一致的 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 会将设备从休眠模式唤醒。因此,它在节能和资源管理方面效率不高。仅将其用于精确的闹钟或通知(例如日历事件),而不是后台工作。

替换已弃用的 API

WorkManager API 是所有以前的 Android 后台调度 API 的推荐替代方案,包括FirebaseJobDispatcherGcmNetworkManagerJobScheduler

入门

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

其他资源

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

视频

博客

示例