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

当工作在应用重启和系统重新启动后仍保持调度状态时,它就是持久性的。WorkManager 是持久性工作的推荐解决方案。由于大多数后台处理最好通过持久性工作来完成,因此 WorkManager 也是通用后台处理的主要推荐 API。

持久性工作类型

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

  • 即时:必须立即开始并很快完成的任务。可以加快执行。
  • 长时间运行:可能运行时间较长的任务,可能超过 10 分钟。
  • 可延迟:在稍后时间开始并可以周期性运行的调度任务。

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

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

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

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

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

开始使用

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

其他资源

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

视频

博客

示例