使用 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 遵守省电功能和最佳实践,例如低电耗模式,因此您无需为此担心。

加快执行的工作

您可以使用 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 的推荐替代方案,包括 FirebaseJobDispatcherGcmNetworkManagerJob Scheduler

入门

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

其他资源

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

示例

视频

博客

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