WorkManager

使用 WorkManager API 可以轻松地调度那些必须可靠地运行的可延期异步任务。通过这些 API,您可以创建任务并将其交给 WorkManager,以便在满足工作约束条件时运行。如需了解详情,请参阅参考文档

声明依赖项

要添加 WorkManager 的依赖项,您必须将 Google Maven 代码库添加到项目中。

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

    dependencies {
      def work_version = "2.2.0"

        // (Java only)
        implementation "androidx.work:work-runtime:$work_version"

        // Kotlin + coroutines
        implementation "androidx.work:work-runtime-ktx:$work_version"

        // optional - RxJava2 support
        implementation "androidx.work:work-rxjava2:$work_version"

        // optional - GCMNetworkManager support
        implementation "androidx.work:work-gcm:$work_version"

        // optional - Test helpers
        androidTestImplementation "androidx.work:work-testing:$work_version"
      }
    

如需了解如何使用 Kotlin 扩展程序,请参阅 ktx 文档

如需详细了解依赖项,请参阅添加编译依赖项

版本 2.3.0-alpha01

2019 年 8 月 22 日

发布了 androidx.work:work-*:2.3.0-alpha01。点击此处可查看此版本中包含的提交内容。

新功能

  • ListenableWorker 现在可以通过 setProgressAsync() API 设置进度。此外,还在 CoroutineWorker 中添加了对应的 suspend setProgress API,在 RxWorker 中添加了 setProgress API(将返回 Single<Void>)。借助这些新的 API,Worker 可以通过 WorkInfo(具有相应的 getProgress API)传达进度信息。(b/79481554)
  • Data 具有 containsKey() API,可用于验证 Worker 的输入数据是否包含预期类型的键。(b/117136838)
  • 现在可以使用 Data.toByteArray()Data.fromByteArray()Data 序列化。请注意,不保证对 Data 进行版本控制,因此您不应将其持久保留或将其用于不同应用之间的 IPC。您只能在同一应用的多个进程之间放心地使用它们。
  • 添加了通过 Configuration.setInputMergerFactory 指定 InputMergerFactory 的功能。(b/133273159)

API 更改

  • 如果 WorkerFactory 返回先前调用的 ListenableWorker 实例,WorkManager 将抛出 IllegalStateException 实例。(b/139554406)
  • 围绕 ListenableFuture 取消和 onStopped() 中的 ListenableWorker 回调进行了文档更新。(b/138413671)

问题修复

  • 进程内调度程序现在会忽略具有 idle 约束的 WorkRequest。现在,仅当设备实际处于 idle 状态时,JobScheduler 才会接收这些请求。(aosp/1089779)
  • 现在,TestScheduler 会在测试中为其内部任务执行程序正确使用指定的 Executor。(aosp/1090749)

版本 2.2.0

2019 年 8 月 15 日

发布了 androidx.work:work-*:2.2.0。点击此处可查看此版本中包含的提交内容。

此版本与 androidx.work:work-*:2.2.0-rc01 完全相同。

从 2.1.0 到 2.2.0 的重要更改

androidx.work:work-gcm:2.2.0 是一个新的 Maven 工件,当 Google Play 服务可用于 API 级别 22 或更低级别时,该工件支持将 GCMNetworkManager 用作调度程序。这是一个可选的依赖项,有助于在较旧的 API 版本上进行更稳定且性能更高的后台处理工作。如果您的应用使用 Google Play 服务,请将此依赖项添加到 gradle 文件,以自动获得 GCMNetworkManager 支持。如果 Play 服务不可用,WorkManager 将继续在旧款设备上回退到 AlarmManager。

版本 2.2.0-rc01

2019 年 7 月 30 日

发布了 androidx.work:work-*:2.2.0-rc01。点击此处可查看此版本中包含的提交内容。

问题修复

  • 修复了 AlarmManager 实现中的一个错误,该错误在极少数情况下会导致服务过早关闭,致使出现 RejectedExecutionException。(aosp/1092374) (b/138238197)
  • 添加了在部分设备上使用 JobScheduler API 时出现的 NullPointerException 的解决方法。(aosp/1091020) (b/138364061) (b/138441699)

版本 2.2.0-beta02

2019 年 7 月 19 日

发布了 androidx.work:work-*:2.2.0-beta02。点击此处可查看此版本中包含的提交内容。

问题修复

  • 移除了在 2.2.0-beta01 中引入的意外 jacoco 依赖项。

版本 2.2.0-beta01

2019 年 7 月 17 日

发布了 androidx.work:work-*:2.2.0-beta01。点击此处可查看此版本中包含的提交内容。

新功能

  • androidx.work:work-gcm:2.2.0-beta01 是一个新的 Maven 工件,当 Google Play 服务可用于 API 级别 22 或更低级别时,该工件支持将 GCMNetworkManager 用作调度程序。这是一个可选的依赖项,有助于在较旧的 API 版本上进行更稳定且性能更高的后台处理工作。如果您的应用使用 Google Play 服务,请将此依赖项添加到 gradle 文件,以自动获得 GCMNetworkManager 支持。如果 Play 服务不可用,WorkManager 将继续在旧款设备上回退到 AlarmManager。

问题修复

  • 修复了在 Nvidia Shield K1 平板电脑上跟踪网络状态时出现的 IllegalArgumentException。(aosp/1010188)

版本 2.1.0

2019 年 7 月 11 日

发布了 androidx.work:work-*:2.1.0。此版本与 androidx.work:work-*:2.1.0-rc01 完全相同。

自 2.0.1 以来的重要更改

  • work-runtime-ktx 现在需要 Java 8。如果您遇到任何问题,可以将以下代码添加到 build.gradlekotlinOptions { jvmTarget = "1.8" }
  • 为 WorkManager 添加了按需初始化,这样将仅在引用 WorkManager 时创建该组件。b/127497100 要设置您的项目以进行按需初始化,请执行以下操作:
    1. 停用自动初始化程序
    2. 在您的自定义 Application 对象上实现 Configuration.Provider
    3. WorkManager.getInstance() 的所有引用更改为 WorkManager.getInstance(Context)。在进行这项更改的过程中,我们已弃用 WorkManager.getInstance()。即使您不进行按需初始化,调用新的 WorkManager.getInstance(Context) 替代方法也总是更安全的做法。
  • PeriodicWorkRequest 现在支持初始延迟。您可以在 PeriodicWorkRequest.Builder 上使用 setInitialDelay 方法来设置初始延迟。b/111404867
  • 添加了使用 DelegatingWorkerFactory 将工作委派给一个或多个已注册 WorkerFactory 的功能。b/131435993
  • 添加了通过 Configuration.Builder.setTaskExecutor 自定义 WorkManager 用来执行其所有内部簿记的 Executor 的功能。
  • 添加了使用 work-testing 工件中的 TestWorkerBuilderTestListenableWorkerBuilder 创建可测试 WorkerListenableWorker 类的功能。
    • 请注意,work-testing 现在将 Kotlin 作为依赖项引入,并且默认情况下包含几个 Kotlin 扩展程序。
  • WorkInfo 中添加了运行尝试计数。b/127290461
  • Data 类型现在可以存储和检索字节和字节数组。这不会更改 Data 对象的大小上限。
  • WorkManager 现在依赖于 Room 2.1.0,这样应该可以解决一些数据库问题。

版本 2.1.0-rc01

2019 年 6 月 27 日

发布了 androidx.work:work-*:2.1.0-rc01。点击此处可查看此版本中包含的提交内容。

问题修复

  • 修复了在备份进行中使用 JobScheduler 执行作业时会导致应用崩溃的问题。b/135858602

版本 2.1.0-beta02

2019 年 6 月 20 日

发布了 androidx.work:work-*:2.1.0-beta02。点击此处可查看此版本中包含的提交内容。

问题修复

  • 现在,TestListenableWorkerBuilder 在创建 ListenableWorker 的实例时会使用正确的 WorkerFactoryb/135275844
  • 修复了由于进程终止而导致在 WorkRequest 的执行窗口中漂移的错误。b/135272196

版本 2.1.0-beta01

2019 年 6 月 13 日

发布了 androidx.work:work-*:2.1.0-beta01。点击此处可查看此版本中包含的提交内容。

问题修复

  • WorkManager 现在依赖于 Room 2.1.0,这样应该可以解决一些数据库问题。
  • 移除了主线程上的一些启动磁盘 I/O。
  • 修复了约束跟踪中的潜在死锁问题。b/134361006
  • 预先取消了归因于 WorkManager 的无效作业。b/134058261
  • 针对行为不当的设备添加了一些对 JobScheduler API 的防御性调用。

版本 2.1.0-alpha03

2019 年 6 月 5 日

发布了 androidx.work:*:2.1.0-alpha03

问题修复

  • 围绕 PeriodicWorkRequest 完善了文档。
  • WorkManagerTestInitHelper 现在会使用正确的后台执行程序进行测试。
  • 修复了在某些设备上处理大型事务时出现的 SQLite 问题。(b/130182503)
  • WorkManager 的依赖项现在更精细。(b/133169148)
  • 解决了在使用 WorkManager 调度作业时,JobScheduler 实现中出现的原始设备制造商 (OEM) 特有问题。
  • 围绕先前导致罕见崩溃问题的服务生命周期对基于 AlarmManager 的调度程序进行了改进。(b/133313734)

版本 2.1.0-alpha02

2019 年 5 月 16 日

发布了 WorkManager 2.1.0-alpha02。此版本包含几个新的 API。

API 更改

  • PeriodicWorkRequest 现在支持初始延迟。您可以在 PeriodicWorkRequest.Builder 上使用 setInitialDelay 方法来设置初始延迟。b/111404867

  • 添加了使用 DelegatingWorkerFactory 将工作委派给一个或多个已注册 WorkerFactory 的功能。b/131435993

  • 添加了通过 Configuration.Builder.setTaskExecutor 自定义 WorkManager 用来执行其所有内部簿记的 Executor 的功能。

  • 围绕 WorkRequest.keepResultsForAtLeast (b/130638001)、按需初始化和 PeriodicWorkRequest.Builder (b/131711394) 完善了文档。

版本 2.1.0-alpha01

2019 年 4 月 24 日

发布了 WorkManager 2.1.0-alpha01。此版本包含几个新的 API。请注意,从此版本开始,将有一些新功能不会反向移植到 1.x 版本。我们建议改用 2.x。

API 更改

  • 为 WorkManager 添加了按需初始化,这样将仅在引用 WorkManager 时创建该组件。b/127497100 要设置您的项目以进行按需初始化,请执行以下操作:
    1. 停用自动初始化程序
    2. 在您的自定义 Application 对象上实现 Configuration.Provider
    3. WorkManager.getInstance() 的所有引用更改为 WorkManager.getInstance(Context)。在进行这项更改的过程中,我们已弃用 WorkManager.getInstance()。即使您不进行按需初始化,调用新的 WorkManager.getInstance(Context) 替代方法也总是更安全的做法。
  • 添加了使用 work-testing 工件中的 TestWorkerBuilderTestListenableWorkerBuilder 创建可测试 WorkerListenableWorker 类的功能。
    • 请注意,work-testing 现在将 Kotlin 作为依赖项引入,并且默认情况下包含几个 Kotlin 扩展程序。
  • WorkInfo 中添加了运行尝试计数。b/127290461
  • Data 类型现在可以存储和检索字节和字节数组。这不会更改 Data 对象的大小上限。
  • 弃用了 CoroutineWorker.coroutineContext。此字段以前错误地输入为 CoroutineDispatcher;您应该不再需要它,因为您可以在暂停函数的主体中自行转到所需的 coroutineContext。
  • RxWorker.createWork()RxWorker.getBackgroundScheduler() 现在带有 @NonNull 返回类型注解。

版本 2.0.1

2019 年 4 月 9 日

发布了 WorkManager 2.0.1。此版本与 2.0.1-rc01 完全相同。

版本 2.0.1-rc01

2019 年 4 月 3 日

发布了 WorkManager 2.0.1-rc01。此版本修复了一些问题。对于旧版 1.x 用户,其中一些更改也会出现在 1.0.1-rc01 中。

问题修复

  • 现在可利用 WorkManager 正常运行 Robolectric 测试。b/122553577
  • 修复了在 JobScheduler 之前的 API 上未清理约束跟踪时出现的极端情况下的崩溃问题。b/129226383
  • 修复了处理长工作链时出现的 StackOverflowErrorb/129091233
  • 围绕 PeriodicWorkRequest 更新了文档,指明 API 23 不支持弹性时间。
  • 修复了 Kotlin 文档中一些损坏的链接。

版本 2.0.0

2019 年 3 月 20 日

发布了 WorkManager 2.0.0。此版本与 2.0.0-rc01 完全相同,它实际上是具有 AndroidX 依赖项的 AndroidX 版的 1.0.0 稳定版。我们建议以此版本(而不是旧版 1.x)为目标版本。所有活跃的开发都将以 2.x 为目标版本,而 1.x 将只在有限的时间内收到重大问题修复。

版本 2.0.0-rc01

2019 年 3 月 7 日

发布了 WorkManager 2.0.0-rc01。此版本与 1.0.0 稳定版完全相同,但具有 AndroidX 依赖项。一旦此版本升级到 2.0.0 稳定版,您就应添加此版本,而旧版 1.x 将只会接收到一些重大问题修复。所有活跃的开发都将以 2.x 为目标版本。

AndroidX 之前的依赖项

如需了解如何使用 Kotlin 扩展程序,请参阅 ktx 文档
参考文档:Java
     dependencies {
        def work_version = "1.0.1"

        // (Java only)
        implementation "android.arch.work:work-runtime:$work_version"

        // Kotlin + coroutines
        implementation "android.arch.work:work-runtime-ktx:$work_version"

        // optional - RxJava2 support
        implementation "android.arch.work:work-rxjava2:$work_version"
        // optional - Test helpers
        androidTestImplementation "android.arch.work:work-testing:$work_version"
      }
    

版本 1.0.1

2019 年 4 月 9 日

发布了 WorkManager 1.0.1。此版本与 1.0.1-rc01 完全相同。

请注意,我们强烈建议用户更新到 WorkManager 2.x,因为今后对 1.x 分支的更新会很少。此外,也不会针对 1.x 库发布新的 API。

版本 1.0.1-rc01

2019 年 4 月 2 日

发布了 WorkManager 1.0.1-rc01。此版本修复了一些问题。

问题修复

  • 现在可利用 WorkManager 正常运行 Robolectric 测试。b/122553577
  • 修复了在 JobScheduler 之前的 API 上未清理约束跟踪时出现的极端情况下的崩溃问题。b/129226383
  • 修复了处理长工作链时出现的 StackOverflowErrorb/129091233

版本 1.0.0

2019 年 3 月 5 日

这是 WorkManager 的 1.0.0 稳定版。此版本的 WorkManager 与 1.0.0-rc02 完全相同。

版本 1.0.0-rc02

2019 年 2 月 21 日

这是 WorkManager 的 1.0.0 稳定版的第二个候选版本。此版本修复了两个问题。

问题修复

  • 现在,在应用崩溃后会正确调度 Workerb/124546316

  • 现在,抛出未检查的 ExceptionWorker 已正确标记为 FAILED 且不再使应用进程崩溃。

版本 1.0.0-rc01

2019 年 2 月 14 日

这是 WorkManager 的 1.0.0 稳定版的一个候选版本。此版本修复了一个问题。

问题修复

  • 现在,基于 AlarmManager 的实现会正确遵循 PeriodicWorkRequests 的 flex 窗口。b/124274584

版本 1.0.0-beta05

2019 年 2 月 6 日

此版本修复了一些问题。

问题修复

  • 修复了在 API 23 上使用 JobScheduler.getPendingJob(...) 的问题。b/123893059
  • 修复了搭载 Android 5.1(API 级别 22)或更低版本的设备上出现的 NullPointerExceptionb/123835104

版本 1.0.0-beta04

2019 年 2 月 4 日

此版本修复了一些问题。

问题修复

  • 针对基于 AlarmManager 的实现改进了 PeriodicWork 的调度。
  • 修复了使用基于 AlarmManager 的实现时 WorkManager 无法正确跟踪约束的问题。b/123379508
  • 修复了使用基于 AlarmManager 的实现时 WorkManager 无法在进程终止后重试工作的问题。b/123329850
  • 修复了使用基于 AlarmManager 的实现时会导致 WorkManager 泄漏 Wakelock 的问题。

版本 1.0.0-beta03

2019 年 1 月 25 日

此版本修复了一些问题。

问题修复

  • 我们引入了回归 1.0.0-beta02,解决了在某些情况下会导致工作无法正常执行的问题。b/123211993
  • 修复了工作未正确遵循退避时间的问题。 b/122881597
  • 修复了搭载 Android 5.1(API 级别 22)或更低版本的设备上出现的 ConcurrentModificationException。这是 1.0.0-beta02 中的问题修复的延续。 b/121345393
  • 为清单中缺少 exported=false 的某些组件添加了此注解。
  • 在软件包级文档中添加了有关 WorkManager 如何与操作系统交互的信息。

版本 1.0.0-beta02

2019 年 1 月 15 日

此版本修复了一些问题。

问题修复

  • 修复了一项极端情况下的问题,即在搭载 Android 6.0(API 级别 23)的设备上,定期工作可能会在每个时间段内运行多次。 b/121998363
  • 修复了搭载 Android 5.1(API 级别 22)或更低版本的设备上出现的 ConcurrentModificationExceptionb/121345393
  • 修复了在搭载 Android 5.1(API 级别 22)或更低版本的设备上未满足约束条件时执行工作出现错误的问题。 b/122578012
  • 优化了工作的完成,在一些极端情况下处理速度更快。 b/122358129
  • 添加了一项更改,解决了 WorkManager 使用的多个 LiveData 实例中潜在的竞争条件问题。
  • 改为使用 Room 依赖项 1.1.1 而非 1.1.1-rc01;这两个版本完全相同。 b/122578011

版本 1.0.0-beta01

2018 年 12 月 19 日

此版本不含任何 API 更改;今后,WorkManager 会在推出下一个版本之前一直确保让 API 保持稳定(除非出现严重问题)。此版本修复了一些问题。

问题修复

  • 如果之前取消的工作是已成功完成的父级工作的子级,则该子级将不再运行。b/120811767
  • 日志记录类现可正确初始化(之前的问题主要在测试期间出现)。

版本 1.0.0-alpha13

2018 年 12 月 12 日

此版本包含一项细微的 API 更改,这项更改将对部分 Kotlin 用户有所帮助。

API 更改

  • androidx.work.Result 已转为 ListenableWorker 的一个内部类。这有助于防止与 Kotlin 的顶级 Result 类发生重构冲突。这是一项重要的 API 更改。b/120564418

重要 API 更改

  • androidx.work.Result 已转为 ListenableWorker 的一个内部类。

版本 1.0.0-alpha12

2018 年 12 月 5 日

此版本包含一些重要的 API 更改,请参阅下面的“重要 API 更改”部分。此版本很可能会作为我们的第一个测试版发布。alpha12 还包含大量的文档更新。

API 更改

  • 一个新软件工件 (work-rxjava2) 引入了 RxWorker。这是一个需要 Single<Payload>ListenableWorker
  • 由于即将弃用 Firebase JobDispatcher,因此已停止提供对它的支持。这意味着,当我们进入测试阶段时,work-firebase 软件工件将不再更新。我们将考虑在未来添加它的替代品。
  • Payload 组合到了 Result 中。Result 现在是一个“密封的类”,它有三个具体实现,您可以通过 Result.success()(或 Result.success(Data))、Result.failure()(或 Result.failure(Data))和 Result.retry() 获取这些实现。您的 ListenableFuture 现在的结果是 Result 而不是 PayloadWorker 没有用于输出 Data 的 getter 和 setter 方法。这是一项重要的更改。
  • 添加了 Constraints.Builder.setTriggerContentMaxDelay(long, TimeUnit)Constraints.Builder.setTriggerContentUpdateDelay(long, TimeUnit) 以及相应变体,以便更好地支持触发速度较慢的内容 URI。b/119919774
  • 添加了 WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, Duration) 变体。此方法需要 API 26。
  • 添加了 Operation.await()ListenableFuture.await() Kotlin 扩展方法。
  • Operation.getException() 已重命名为 Operation.getThrowable()这是一项重要的更改。
  • ContentUriTriggers 类以及引用它的方法不再可供公共使用。这是一项重要的更改。
  • WorkManagerWorkContinuationOneTimeWorkRequest 中移除了 varargs 方法的剩余部分以简化 API。要解决任何编译问题,您可以使用 Arrays.asList(...) 封装现有的 varargs。我们仍然会包含每个方法的单参数版本。这是一项重要的更改。
  • 移除了 WorkContinuation.combine(OneTimeWorkRequest, *) 变体。它们之前呈现的 API 令人困惑,而现有的 combine 方法更容易理解。这是一项重要的更改。

问题修复

  • 现在,在恢复已终止的进程(任务已执行)时,版本低于 Marshmallow 的实现更加可靠。
  • 通过 observeForever 观察的 LiveData 会通过 WorkManager 进行跟踪。这是 Room 库修复的向后移植。b/74477406
  • 如果序列化对象超过其大小上限,Data.Builder.build() 现在会抛出异常。之前这种情况只发生在后台线程(您无法正确处理这种问题)。
  • 进一步区分了“停止”操作和“取消”操作,getWorkInfoById() 将在 ListenableWorker.onStopped() 期间返回具有 CANCELLED StateWorkInfo
  • ListenableWorker 中将 null Result 视为失败。b/120362353
  • 对运行 API 24 且有时抛出 IllegalArgumentException 的 Shield Tablets 进行了推测性修复。b/119484416

重要 API 更改

  • 由于即将弃用 Firebase JobDispatcher,因此已停止提供对它的支持。这意味着,当我们进入测试阶段时,work-firebase 软件工件将不再更新。我们将考虑在未来添加它的替代品。
  • Payload 组合到了 Result 中。Result 现在是一个“密封的类”,它有三个具体实现,您可以通过 Result.success()(或 Result.success(Data))、Result.failure()(或 Result.failure(Data))和 Result.retry() 获取这些实现。您的 ListenableFuture 现在的结果是 Result 而不是 PayloadWorker 没有用于输出 Data 的 getter 和 setter 方法。
  • 添加了 Operation.await()ListenableFuture.await() Kotlin 扩展方法。
  • Operation.getException() 已重命名为 Operation.getThrowable()
  • ContentUriTriggers 类以及引用它的方法不再可供公共使用。
  • WorkManagerWorkContinuationOneTimeWorkRequest 中移除了 varargs 方法的剩余部分以简化 API。要解决任何编译问题,您可以使用 Arrays.asList(...) 封装现有的 varargs。我们仍然会包含每个方法的单参数版本。
  • 移除了 WorkContinuation.combine(OneTimeWorkRequest, *) 变体。它们之前呈现的 API 令人困惑,而现有的 combine 方法更容易理解。

版本 1.0.0-alpha11

2018 年 11 月 8 日

此版本包含多项更改,它们将使 API 在 beta 版本中变得稳定。此版本包含重要的 API 更改,请参阅下面的“重要 API 更改”部分。

API 更改

  • work-runtime-ktx 引入了一个新的 CoroutineWorker
  • WorkStatus 已重命名为 WorkInfo。所有对应的 getStatus 方法变体都已重命名为对应的 getWorkInfo 变体。这是一项重要的更改。
  • ListenableWorker.onStopped() 不再具有表示 WorkRequest 是否已取消的布尔值参数。 WorkManager 不再做出这种区分。这是一项重要的更改。
  • androidx.work.test 软件包已重命名为 androidx.work.testing 软件包。这是一项重要的更改。
  • Constraints 的 setter 不再是公共 API 的一部分。这是一项重要的更改。
  • WorkerParameters.getTriggeredContentUris()WorkerParameters.getTriggeredContentAuthorities() 之前会返回数组。现在,这些方法会返回集合。这是一项重要的更改。
  • ListenableWorker.onStartWork() 已重命名为 ListenableWorker.startWork()这是一项重要的更改。
  • WorkStatus 的构造函数不再是公共 API 的一部分。这是一项重要的更改。
  • Configuration.getMaxJobSchedulerID()Configuration.getMinJobSchedulerID() 已分别重命名为 Configuration.getMinJobSchedulerId()Configuration.getMaxJobSchedulerId()这是一项重要的更改。
  • 向公共 API 添加了大量的 @NonNull 注解,以改进 API 的工效设计。
  • 添加了 WorkManager.enqueueUniqueWork() API 以将唯一的 OneTimeWorkRequest 加入队列,而不必创建 WorkContinuation
  • WorkManager 上的 enqueuecancel 方法的所有变体现在都会返回一个新的 Operation 类型。这是一项重要的更改。
  • enqueue 的所有变体都不再接受 WorkRequest 的 varargs。这是一项重要的更改。请改用集合。您可以使用 Arrays.asList() 修改现有代码。我们这样做是为了缩减 API 表面和方法计数。
  • 在每个进程中尝试多次 initialize WorkManager 现在会导致出现 IllegalStateException这是一项重要的更改。

问题修复

  • work-runtime-ktx 软件工件中的 WorkRequest.Builder 现在使用 ListenableWorker。修复 b/117666259
  • 确保 PeriodicWork 的下次运行时间是将来的时间。修复 b/118204399
  • 移除了在应用启动时使用 WorkManager 所产生的潜在磁盘 I/O。修复 b/117796731
  • 修复了 WorkConstraintsTracker 中的竞争条件。修复 android-workmanager/issues/56

重要 API 更改

  • WorkStatus 已重命名为 WorkInfo。所有对应的 getStatus 方法变体都已重命名为对应的 getWorkInfo 变体。
  • ListenableWorker.onStopped() 不再具有表示 WorkRequest 是否已取消的布尔值参数。 WorkManager 不再做出这种区分。
  • androidx.work.test 软件包已重命名为 androidx.work.testing 软件包。
  • Constraints 的 setter 不再是公共 API 的一部分。
  • WorkerParameters.getTriggeredContentUris()WorkerParameters.getTriggeredContentAuthorities() 之前会返回数组。现在,这些方法会返回集合。
  • ListenableWorker.onStartWork() 已重命名为 ListenableWorker.startWork()
  • WorkStatus 的构造函数不再是公共 API 的一部分。
  • Configuration.getMaxJobSchedulerID()Configuration.getMinJobSchedulerID() 已分别重命名为 Configuration.getMinJobSchedulerId()Configuration.getMaxJobSchedulerId()
  • 针对 WorkManagerenqueuecancel 方法的所有变体现在都会返回一个新的 Operation 类型。
  • enqueue 的所有变体均不再接受 WorkRequest 的 varargs。
  • 在每个进程中尝试多次 initialize WorkManager 现在会导致出现 IllegalStateException

版本 1.0.0-alpha10

2018 年 10 月 11 日

此版本支持开发者控制的异步工作。此版本包含重要的 API 更改,请参阅下面的“重要 API 更改”部分。

我们预计 WorkManager 正在进入其 alpha 版本期间的最后阶段。我们希望在测试版中使 API 变得稳定,因此请花一些时间在我们的问题跟踪器上提交反馈。

API 更改

  • 移除了所有之前的 deprecated 方法和类,尤其是默认的 Worker 构造函数。这是一项重要的 API 更改。
  • NonBlockingWorker 已重命名为 ListenableWorker,它现在是一个取消隐藏的公共类,随时可供使用。
    • 通过 ListenableWorker 可以访问一个在主线程上调用的抽象方法,即 ListenableFuture<Payload> onStartWork()。异步启动和处理工作由您负责执行。完成后,您应该适当地更新 ListenableFutureListenableFuture 的参考实现在 alpha02Futures 软件包中提供(请参阅下面的 WorkManager 部分)。
    • Worker 扩展了 ListenableWorker,它使用抽象的 Result doWork() 方法,仍然像以前那样运行。
    • 将一些方法和成员从 Worker 转移到了 ListenableWorker
    • 我们应该很快就会提供 ListenableWorker 的参考实现,这些实现使用 Kotlin 协程(发布稳定版本后)和 RxJava2。
  • 接口 WorkerFactory 和具体实现 DefaultWorkerFactory 已合并到一个名为 WorkerFactory 的抽象类中。该实现可确保,对于任何用户创建的 WorkerFactory 实例,调用默认的基于反射的行为是最后的尝试。这是一项重要的更改。
  • 移除了 WorkManager.synchronous()WorkContinuation.synchronous() 以及所有相关方法。添加了 ListenableFuture<Void> 作为 API 中许多方法的返回类型。这是一项重要的 API 更改。
    • 您现在可以使用 ListenableFuture 来同步获取和观察。例如,WorkManager.enqueue() 过去返回 void,而现在则返回 ListenableFuture<Void>。操作完成后,您可以调用 ListenableFuture.addListener(Runnable, Executor)ListenableFuture.get() 来运行代码。
    • 请注意,这些 ListenableFuture 不会告知您操作是成功还是失败,而只是告知您操作已完成。您仍需要关联 WorkManager 方法来获取这项信息。
    • 我们会忽略对这些对象的 cancel() 调用,因为它们令人困惑且难以推断(您是要取消操作本身还是取消操作的结果?)。这在 Future 的规定范围内。
    • 为了与同步的 getStatus* 方法保持对等,我们提供了 ListenableFuture 变体,并对返回 LiveData 的现有变体进行了重命名,明确地将“LiveData”作为名称的一部分(例如,getStatusesByIdLiveData(UUID))。这是一项重要的 API 更改。

问题修复

  • 修复了 alpha09 中关于重复的 androidx-annotations.pro 文件的已知问题。您可以通过从 Gradle 文件中删除 exclude 'META-INF/proguard/androidx-annotations.pro' 来移除之前的版本说明中的解决方法。
  • 添加了 ProGuard 配置以保留新的 Worker 构造函数。b/116296569
  • 修复了在对工作进行 REPLACE 处理后的竞争条件下潜在的 NullPointerException 问题。b/116253486b/116677275
  • WorkContinuation.combine() 现在接受一个或更多 WorkContinuation,而不是两个或更多。b/117266752

重要 API 更改

  • 移除了所有之前的 deprecated 方法和类,尤其是默认的 Worker 构造函数。
  • 接口 WorkerFactory 和具体实现 DefaultWorkerFactory 已合并到一个名为 WorkerFactory 的抽象类中。
  • 移除了 WorkManager.synchronous()WorkContinuation.synchronous()
  • WorkManager.getStatus*() 方法现在返回 ListenableFutureWorkManager.getStatus*LiveData() 返回 LiveData

版本 1.0.0-alpha09

2018 年 9 月 19 日

已知问题

如果您遇到以下问题:“发现多个文件的路径与操作系统无关‘META-INF/proguard/androidx-annotations.pro’”,请在 Gradle 文件中添加以下内容来临时解决这个问题(同时我们将在 alpha10 中解决此问题):

    android {
            packagingOptions {
                exclude 'META-INF/proguard/androidx-annotations.pro'
            }
        }
    

问题修复

  • 添加了“100 个作业”错误所需的另一个修复程序。b/115560696
  • 针对由于竞争条件而导致的外键约束错误添加了一些修复程序。b/114705286
  • ConstraintTrackingWorker.onStopped(boolean) 调用委托给了底层 Workerb/114125093
  • 针对 Firebase JobDispatcher 强制采用正确的最小退避延迟。b/113304626
  • 改进了库的内部线程保证。
  • 更正了与 LiveData 内部重复数据删除有关的潜在问题。

API 更改

  • 您现在可以通过将 WorkerFactory 指定为 WorkManager.Configuration 的一部分,在运行时创建自己的 Worker 实例。后备出厂设置为 DefaultWorkerFactory,它与之前版本的 WorkManager 的行为相符。
    • WorkerNonBlockingWorker 的默认构造函数现在标记为已弃用。请使用新的构造函数 (Worker(Context, WorkerParameters)) 并调用 super(Context, WorkerParameters),我们将在未来版本的 WorkManager 中移除默认构造函数。
  • 我们在内部已开始使用新的 ListenableFuture 软件工件(没有 Guava 依赖项)。我们将在即将发布的版本中向 API 引入 ListenableFutures。此更改将支持最终取消隐藏 NonBlockingWorker
  • 添加了通过 TestDriver.setInitialDelayMet(UUID)TestDriver.setPeriodDelayMet(UUID)TestDriver 中触发定时工作的功能。b/113360060

重要更改

  • 已弃用默认的 WorkerNonBlockingWorker 构造函数。请尽快迁移到新的构造函数。我们将在未来版本中移除默认构造函数。

版本 1.0.0-alpha08

2018 年 8 月 27 日

问题修复

  • 将 WorkManager 组件明确标记为无法感知直接启动,这样它们就不会在直接启动期间启动。将来,我们将提供可感知直接启动的 WorkManager 版本。b/112665532
  • 修复了重试的工作未运行的问题。b/112604021
  • 修复了未重复执行定期工作的问题(与上述问题相关)。b/112859683
  • 当应用进程已在运行时,遵循了退避策略。
  • 更正了 Data 中的异常错误消息,以指明限制为 10KB。
  • Configuration.setMaxSchedulerLimit(int) 的最大值减小到了 50,以补偿 JobScheduler 处理过程中的一些延迟。b/112817355

版本 1.0.0-alpha07

2018 年 8 月 16 日

问题修复

  • 修复了具有负限制的潜在 SQL 查询,该查询可能会返回无限数量的结果。
  • 已完成执行的工作现在可以正确取消其他调度程序中该工作的所有待处理副本。这会导致超出 JobScheduler 作业限制。b/111569265
  • 修复了 ConstraintTracker 中的 ConcurrentModificationExceptionb/112272753
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注解更改为 @Nullable 而不是 @NonNullb/112275229

API 更改

  • Worker 现在扩展了一个新类 NonBlockingWorker。这不会影响任何当前的用法。将来,NonBlockingWorker 将成为自定义线程解决方案完全支持的实体。
  • Data.getBooleanArray(String)Data.getIntArray(String) 的返回类型注解更改为 @Nullable 而不是 @NonNullb/112275229
  • Kotlin 扩展程序:弃用了 Map.toWorkData() 而添加了顶级 workDataOf(vararg Pair<String, Any?>),以便与现有 API 更加一致。

版本 1.0.0-alpha06

2018 年 8 月 1 日

问题修复

版本 1.0.0-alpha05

2018 年 7 月 24 日

API 更改

  • WorkManager.getInstance() 现在带有 @NonNull 而不是 @Nullable 注释。如果在手动初始化的情况下未正确初始化单一实例,则该方法将抛出 IllegalStateException这是一项重要的 API 更改。
  • 添加了一个新的 API,即 Configuration.Builder.setMinimumLoggingLevel(int),它可以控制 WorkManager 的详细程度。默认情况下,WorkManager 会记录 Log.INFO 及更高级别的信息。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。这是一项重要的 API 更改。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])这是一项重要的 API 更改。

问题修复

  • 在已知的自动备份情况下,WorkManager 不再执行工作。这可能会导致出现崩溃。b/110564377
  • 修复了使用 JobScheduler 时的 PeriodicWorkRequest 双重调度问题。b/110798652
  • 修复了在设备低电耗模式后 PeriodicWorkRequest 无法正确执行的问题。b/111469837
  • 修复了使用 Firebase JobDispatcher 时初始延迟的问题。b/111141023
  • 修复了一些潜在的竞争条件和时间问题。
  • 正确释放了不再需要的 BroadcastReceiver
  • 优化了应用在强制关闭后重启时的重新调度性能。
  • 允许在将给定的 WorkRequest 加入队列之前或之后调用 TestScheduler.setAllConstraintsMet(UUID)b/111238024

重要更改

  • WorkManager.getInstance() 现在带有 @NonNull(而不是 @Nullable)注释。
  • 更改了 Data.getString() 的签名,因此它不再采用默认值(隐式为 null)。
  • 将需要的某些仅供内部使用的方法标记为 @hide。其中包括 Constraints 构造函数 Data.toByteArray()Data.fromByteArray(byte[])

版本 1.0.0-alpha04

2018 年 6 月 26 日

问题修复

  • 当使用基于 AlarmManager 的实现时,现在可以正确地重新调度 PeriodicWorkRequest
  • 修复了在强行停止或重新启动后重新调度所有 Worker 线程时出现的潜在 ANR 问题。b/110507716
  • 向各种 WorkManager API 添加了为空性注解。b/110344065
  • 记录在 Worker 线程执行期间发生的未捕获异常。b/109900862
  • 在您决定回滚到较低版本的 WorkManager 时,允许进行破坏性数据库迁移。b/74633270
  • 修复了在创建重复隐式标记时出现的迁移崩溃问题。这是一个很少见的问题,只有在您自己使用相同的隐式标记格式时才会发生。

版本 1.0.0-alpha03

2018 年 6 月 19 日

问题修复

  • 修复了基于 AlarmManager 的实现中的竞争条件问题。b/80346526

  • 修复了在设备重新启动后使用 JobScheduler 时出现的重复作业问题。

  • 具有内容 URI 触发器的作业现在可以在系统重新启动后保留。b/80234744

  • 文档更新。b/109827628b/109758949b/80230748

  • 修复了在将 WorkRequest 重新加入队列时出现的崩溃问题。b/109572353

  • 修复了在使用 work-runtime-ktx 依赖项时出现的 Kotlin 编译器警告。

  • WorkManager 现在使用 Room 1.1.1-rc1

API 更改

  • 添加了 getStatusesSync(),即 WorkContinuation.getStatuses() 的同步版本。
  • Worker 能够区分用户发起的取消和操作系统请求的临时停止。如果已请求任何类型的停止,Worker.isStopped() 将返回 true。显式取消 Worker 线程后,Worker.isCancelled() 将返回 trueb/79632247
  • 在 API 28 上添加了对 JobParameters#getNetwork() 的支持。这通过 Worker.getNetwork() 公开。
  • 添加了 Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit),这样便可强制规定可以将多少作业发送到 JobSchedulerAlarmManager。这有助于防止 WorkManager 占用所有可用的 JobScheduler 插槽。
  • 添加了 Configuration.setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId),它有助于定义 WorkManager 尽可放心使用的一系列 JobScheduler 作业 ID。b/79996760
  • Worker.getRunAttemptCount() 返回给定 Worker 的当前运行计数。b/79716516
  • 通过 WorkManager.enqueueUniquePeriodicWork(String uniqueWorkName, ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy, PeriodicWorkRequest periodicWork),可以将唯一的 PeriodicWorkRequest 加入队列。b/79600647
  • WorkManager.cancelAllWork() 会取消所有 Worker。依赖于 WorkManager 的库可以使用 WorkManager.getLastCancelAllTimeMillis() 查询上次调用此方法的时间,以便对内部状态进行额外的清理。
  • 添加了 WorkManager.pruneWork() 以从内部数据库中移除完成的作业。b/79950952b/109710758

行为更改

  • 为所有 WorkRequest 添加了一个隐式标记,它是 Worker 的完全限定类名。这样便能够在没有 tag 的情况下或在 id 不可用时移除 WorkRequestb/109572351

重要更改

  • Worker.WorkerResult 重命名为 Worker.Result
  • Worker.onStopped 现在有一个额外的 isCancelled 参数,显式取消 Worker 后,该参数将设置为 true

版本 1.0.0-alpha02

2018 年 5 月 24 日

问题修复

  • 修复了在 State.isFinished() 时出现的 NullPointerExceptionb/79550068
  • 修复了导致在 Application.onCreate() 时重新调度 Worker 的问题。b/79660657
  • 修复了您可以调度的作业数超过操作系统允许的作业数的问题。b/79497378
  • 将与 Worker 关联的唤醒锁定的清理工作移到了后台线程。
  • 当所有待处理的作业完成时,AlarmManager 实现现在可以正确清理。
  • 修复了会影响非英语语言区域的清理 SQL 查询。b/80065360
  • Data 中添加了对 float 的支持。b/79443878
  • Data.Builder.putAll() 现在会返回 Builder 的实例。b/79699162
  • 文档中介绍了更多 javadoc 和修复程序。b/79691663

API 更改

  • Worker 可以对停止做出响应。Worker.isStopped() 可用于检查 Worker 是否已停止。Worker.onStopped() 可用于执行轻量级清理操作。
  • Worker.getTags() API 将返回与 Worker 关联的标记 Set
  • 为 API 添加了 javax.time.Duration 过载,它接受时长和 TimeUnit 的组合。受 @RequiresApi(26) 保护。
  • WorkManager 扩展已从 androidx.work.ktx 软件包移至 androix.work 软件包。旧的扩展已弃用,将在以后的版本中移除。
  • Configuration.withExecutor() 已弃用。请改用 Configuration.setExecutor()

版本 1.0.0-alpha01

2018 年 5 月 8 日

WorkManager 可以简化有保证的约束感知型后台工作的调度和执行。此初始版本为 1.0.0-alpha01