使用 WorkManager 安排任务   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 的更多信息,请参阅 定义您的 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 的推荐替代方案,包括FirebaseJobDispatcherGcmNetworkManagerJob Scheduler

入门

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

其他资源

有关WorkManager 的更多信息,请参阅以下资源。

示例

视频

博客

  • 注意:当 JavaScript 关闭时,链接文本将显示
  • 应用启动