WorkManager
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 9 月 4 日 | 2.9.1 | - | - | 2.10.0-alpha03 |
声明依赖项
如需添加 WorkManager 的依赖项,您必须将 Google Maven 代码库添加到项目中:
在应用或模块的 build.gradle
文件中添加所需工件的依赖项:
Groovy
dependencies { def work_version = "2.9.1" // (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" // optional - Multiprocess support implementation "androidx.work:work-multiprocess:$work_version" }
Kotlin
dependencies { val work_version = "2.9.1" // (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") // optional - Multiprocess support implementation("androidx.work:work-multiprocess:$work_version") }
如需了解如何使用 Kotlin 扩展,请参阅 ktx 文档。
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 2.10
版本 2.10.0-alpha03
2024 年 9 月 4 日
发布了 androidx.work:work-*:2.10.0-alpha03
。版本 2.10.0-alpha03 中包含这些提交内容。
新功能
- 向
WorkManager
中的作业添加了跟踪标记,这使得“adb shell dumpsys jobscheduler”更易于理解,因为它将包含正在执行的 worker 的名称。此外,还围绕WorkManager
的关键区域添加了轨迹部分。
API 变更
- WorkManager 2.10.0 现在使用 SDK 35 进行编译。
- 修复了在
WorkManager
未调用stopSelf()
时,“short service”和“data sync”类型的前台工作器超时并导致 ANR 的问题。此修复仅适用于引入了前台服务类型的 API 级别为 34 和 35 的设备。(ca06b2、b/364508145) - 新增了
WorkerParameters
API,可让您在使用WorkerFactory
时切换Worker
绑定到的远程进程。(Ibdc8a、Ie8a90、I7373f)
bug 修复
- 修复了当工作的前台类型的 Android 14 必备权限被撤消时,
WorkManager
尝试重启长时间运行的 worker(即前台 worker)导致的崩溃问题。(b/333957914) - 移除了对新平台 API 访问权限的手动概述,因为在将 R8 与 AGP 7.3 或更高版本(例如 R8 版本 3.3)搭配使用时,系统会自动通过 API 建模来实现上述目的;而对于使用 AGP 8.1 或更高版本(例如 D8 版本 8.1)的所有 build,这种情况会自动发生。建议未使用 AGP 的客户端更新到 D8 8.1 或更高版本。详情请参阅这篇文章。(Ia60e0、b/345472586)
版本 2.10.0-alpha02
2024 年 4 月 17 日
发布了 androidx.work:work-*:2.10.0-alpha02
。版本 2.10.0-alpha02 中包含这些提交内容。
API 变更
- 添加了通过
WorkManager
中可配置的@RestrictTo
Tracer
发出轨迹 span 的功能。(I17d7f、b/260214125) - 添加了
Configuration.workerCoroutineContext
,用于控制执行CoroutineWorker
的调度程序。这有助于完全避免在WorkManager
中使用Dispatchers.Default
。(Icd1b7) - 为工作器添加自定义异常处理程序(Ib1b74、b/261190695)
- 现在,可以使用
KClass
(而非Class
)构造OneTimeWorkRequest.Builder
和PeriodicWorkRequest.Builder
:val request = OneTimeWorkRequest.Builder(Worker::class).setConstraints(...).build()
(Ib55f6) WorkManager
类已迁移到 Kotlin。现在,返回LiveData
、ListenableFuture
或Flow
的方法会提供正确的可为 null 性信息。可能需要更改客户的如果该代码中的可为 null 性假设不正确,则会发生该错误。(If6757)
版本 2.10.0-alpha01
2024 年 1 月 24 日
发布了 androidx.work:work-*:2.10.0-alpha01
。版本 2.10.0-alpha01 中包含这些提交内容。
新功能
- 开发者可以通过
Constraints.setRequiredNetworkRequest
方法将NetworkRequest
指定为 worker 的约束条件。这样可以更精细地控制应运行哪个网络。
API 变更
- 添加了将
NetworkRequest
指定为限制条件的功能。(Id98a1、b/280634452)
版本 2.9
版本 2.9.1
2024 年 8 月 7 日
发布了 androidx.work:work-*:2.9.1
。版本 2.9.1 中包含这些提交内容。
bug 修复
- 修复了当工作的前台类型具有已撤消的 Android 14 必备权限时,
WorkManager
尝试重启长时间运行的 worker(即前台 worker)导致的崩溃问题。(b/333957914)
版本 2.9.0
2023 年 11 月 29 日
发布了 androidx.work:work-*:2.9.0
。版本 2.9.0 中包含这些提交内容。
自 2.8.0 以来的重要变更
- 通过
Flow
-s 实现可观测性。现在,可以通过 Flow 的WorkManager.getWorkInfosFlow
和类似方法观察 worker 的进度,而不是使用LiveData
。 - 现在,
WorkManager
提供了有关之前停止 worker 原因的提示。您可以通过getStopReason()
方法从 worker 本身查询,也可以通过getStopReason()
从WorkInfo
查询。 - 通过
setNextScheduleTimeOverride
精确安排定期工作器。这允许动态计算下一个 Periodic 工作时间表,该时间表可用于实现高级功能,例如自适应刷新时间、自定义重试行为,或使 Newsfeed worker 在用户每天早上醒来之前运行而不会偏移。ExistingPeriodicWorkPolicy.UPDATE
应与这些方法搭配使用,以避免在调度下一个工作器时取消当前正在运行的工作器。 - 使用线程匹配生产进行的 WorkManager 测试。
ExecutorsMode.PRESERVE_EXECUTORS
可以在initializeTestWorkManager
中使用,以保留在Configuration
中设置的执行器并使用实际的主线程。 CoroutineWorker
等协程 API 已从其他工件 work-runtime-ktx 移至主工件 work-runtime。work-runtime-ktx 现在为空。
API 变更
- 已将“
stopReason
”添加到“WorkInfo
”。它会在 worker 运行后使stopReason
可用。这对于以可用的方式报告stopReason
很有帮助,因为一旦停止 worker,应用本身可能会很快终止。(I21386) - 允许通过配置设置
Clock
,并用于驱动工作器测试的执行序列。(Ic586e) ListenableWorker
中添加了getStopReason()
方法,可提示 worker 停止的原因。(I07060)- 添加了
WorkManagerTestInitHelper#closeWorkDatabase()
,以避免 Closeguard 发出有关资源泄露的警告。(Ia8d49) WorkInfo
的构造函数现在是公开的,这在测试中非常有用。(Ia00b6、b/209145335)work-runtime-ktx
现在为空,主工作运行时工件中现已提供CoroutineWorker
和其他 Kotlin 专用实用程序。(I71a9a)- 添加了
setNextScheduleTimeOverride
方法,用于准确设置定期工作时间表 (I3b4da) - 向
WorkInfo
添加了getNextScheduleTimeMillis
,以获取安排的运行时信息。(I797e4) - 初始延迟时间和周期信息已添加到
WorkInfo
。(I52f2f) - 添加了通过
getWorkInfosByTagFlow
、getWorkInfoByIdFlow
、getWorkInfosForUniqueWorkFlow
、getWorkInfosFlow
方法通过 Flow 观察 worker 的方法 (If122a) - 向
Constraints
' 添加了缺失的@RequiresApi(...)
注解构造函数和属性。它们现在与WorkManager
早期版本中存在的Constraints.Builder
中的 setter 的相应注解保持一致。(I6d7d2) WorkManager
现在对内容 URI 工作器设置了单独的限制,以便在JobScheduler
中为其提供有保证的槽,以防止在高负载下丢失内容更新。可通过Configuration.Builder.setContentUriTriggerWorkersLimit
配置该限制。(Ic128f)- 约束条件已添加到
WorkInfo
。(I162c0)
版本 2.9.0-rc01
2023 年 10 月 18 日
发布了 androidx.work:work-*:2.9.0-rc01
。版本 2.9.0-rc01 中包含这些提交内容。
- 自上一个 Beta 版以来没有任何变化
版本 2.9.0-beta01
2023 年 9 月 6 日
发布了 androidx.work:work-*:2.9.0-beta01
。版本 2.9.0-beta01 中包含这些提交内容。
API 变更
- 针对
WorkInfo.stopReason
和ListenableWorker.stopReason
返回的停止原因添加了常量 (I0cc00)
版本 2.9.0-alpha02
2023 年 7 月 26 日
发布了 androidx.work:work-*:2.9.0-alpha02
。版本 2.9.0-alpha02 中包含这些提交内容。
新功能
- 现在,
WorkManager
提供了有关之前停止 worker 原因的提示。您可以通过getStopReason()
方法从 worker 本身进行查询,也可以通过getStopReason()
从WorkInfo
查询。
API 变更
- 已将“
stopReason
”添加到“WorkInfo
”。它会在 worker 运行后提供stopReason
。这对于以可用方式报告stopReason
很有帮助,因为一旦停止 worker,应用本身可能会很快终止。(I21386) - 允许通过配置设置时钟,并用于驱动工作器测试的执行序列。(Ic586e)
ListenableWorker
中添加了getStopReason()
方法,可提示 worker 停止的原因。(I07060)- 添加了
WorkManagerTestInitHelper#closeWorkDatabase()
,以避免 Closeguard 发出有关资源泄露的警告。(Ia8d49)
bug 修复
- 添加了使用
TestDriver
绕过overrideNextScheduleTime
的功能,并修复了可测试性问题。(Ic2905)
版本 2.9.0-alpha01
2023 年 6 月 7 日
发布了 androidx.work:work-*:2.9.0-alpha01
。版本 2.9.0-alpha01 中包含这些提交内容。
新功能
- 通过
Flow
-s 实现可观测性。现在,可以通过 Flow 的WorkManager.getWorkInfosFlow
和类似方法观察 worker 的进度,而不是使用LiveData
。 - 通过
setNextScheduleTimeOverride
精确安排定期工作器。这允许动态计算下一个 Periodic 工作时间表,该时间表可用于实现高级功能,例如自适应刷新时间、自定义重试行为,或使 Newsfeed worker 在用户每天早上醒来之前运行而不会偏移。ExistingPeriodicWorkPolicy.UPDATE
应与这些方法搭配使用,以避免在调度下一个工作器时取消当前正在运行的工作器。 WorkManager
使用线程匹配的正式版进行的测试。ExecutorsMode.PRESERVE_EXECUTORS
可用于保留Configuration
中设置的执行器以及使用实际的主线程。- 协程 API(例如
CoroutineWorker
)已从其他工件work-runtime-ktx
移至主工件work-runtime
。work-runtime-ktx
现在为空。
API 变更
WorkInfo
的构造函数现在是公开的,这在测试中非常有用。(Ia00b6、b/209145335)work-runtime-ktx
现在为空,CoroutineWorker
和其他 Kotlin 专用实用程序现已在主work-runtime
工件中提供。(I71a9a)- 添加了
setNextScheduleTimeOverride
方法,用于准确设置定期工作时间表 (I3b4da) getEarliestRunTimeMillis
已重命名为getNextScheduleTimeMillis
。(I2bd7a)- 下一次预定的运行时间信息会添加到
WorkInfo
中。(I797e4) - 初始延迟时间和周期信息已添加到
WorkInfo
。(I52f2f) - 添加了通过
getWorkInfosByTagFlow
、getWorkInfoByIdFlow
、getWorkInfosForUniqueWorkFlow
、getWorkInfosFlow
方法通过 Flow 观察 worker 的方法 (If122a) - 向 Constraints 的
@RequiresApi(...)
构造函数和属性。它们现在与WorkManager
早期版本中存在的Constraints.Builder
中的 setter 的相应注解保持一致。(I6d7d2) WorkManager
现在对内容 URI 工作器设置了单独的限制,以便在JobScheduler
中为其提供有保证的槽,以防止在高负载下丢失内容更新。可通过Configuration.Builder.setContentUriTriggerWorkersLimit
配置限制。(Ic128f)- 约束条件已添加到
WorkInfo
。(I162c0)
版本 2.8
版本 2.8.1
2023 年 3 月 22 日
发布了 androidx.work:work-*:2.8.1
。版本 2.8.1 中包含这些提交内容。
bug 修复
- 修复了
RescheduleReceiver
中的 ANR,之前无法正确处理两个同时进行的广播。(b/236906724)
版本 2.8.0
2023 年 2 月 8 日
发布了 androidx.work:work-*:2.8.0
。版本 2.8.0 中包含这些提交内容。
自 2.7.0 以来的重要变更
新功能
- 添加了以非干扰性方式更新
WorkRequests
的功能,以保持原始排队时间、工作链等。您可以参阅有关此功能的详细博文以及WorkManager.updateWork
和ExistingPeriodicWorkPolicy.UPDATE
的 Javadoc,以了解详情。
API 变更
- 添加了
WorkManager.updateWork
,用于更新工作并保持其原始排队时间和工作链。(I9a248、b/219446409) - 添加了
ExistingPeriodicWorkPolicy.UPDATE
。此政策允许按名称更新定期工作。它与现有的REPLACE
类似,但干扰性更小:它不会取消目前正在运行的工作器并且会保持排队时间 - 初始延迟和期间是根据原始排队时间(而非更新时间)计算的。废弃了REPLACE
,以缓解名称非常类似的REPLACE
和UPDATE
之间发生混淆的问题。如果您仍想保留REPLACE
的旧语义,则可以使用新添加的CANCEL_AND_REENQUEUE
,它与REPLACE
相同。(I985ed、b/219446409) - 添加了通过 setSchedulingExceptionHandler 拦截提供
Consumer<Throwable>
的调度异常的功能 - 添加了通过 setInitializationExceptionHandler 提供
Consumer<Throwable>
的功能,以确定尝试初始化 WorkManager 时是否存在问题。 OneTimeWorkRequest
和PeriodicWorkRequest
的内嵌帮助程序已从androidx.work:work-runtime-ktx
移至androidx.work:work-runtime
(I0010f、b/209145335)- 添加了
WorkQuery.fromIds
、WorkQuery.fromStates
、WorkQuery.fromUniqueWorkNames
和WorkQuery.fromTags
辅助方法,以直接创建WorkQuery
。(b/199919736)(If48f2、b/199919736) - 为
Worker
添加了getForegroundInfo
。(Ic1ead) - 适用于 RxJava 2 和 RxJava 3 的
RxWorker
现在具有返回Completable
的setForeground
,可用于代替返回ListenableFuture
的setForegroundInfoAsync
- 适用于 RxJava 2 和 RxJava 3 的
RxWorker
具有返回Single
的getForegroundInfo
,可用于代替返回ListenableFuture
的getForegroundInfoAsync
。(b/203851459) - 现在可以直接构建约束条件而无需使用
Constraints.Builder
,这对于 Kotlin 用户非常方便。(Idc390、b/137568653) - 添加了检查
WorkManager
是否已初始化的功能。此外,还为库开发者添加了新的getConfiguration()
API,用于获取WorkManager
进行初始化时使用的配置。(I6eff3、b/212300336)
bug 修复
- 修复了 GreedyScheduler 在工作器处于负载状态时会阻止其立即运行的问题。(I9686b、b/248111307)
- 向在 SDK 33 及更高版本中需要授予
POST_NOTIFICATIONS
权限的 API 添加了@RequiresPermission
。(Ie542e、b/238790278) - 使用
suspendCancellableCoroutine
时,将CoroutineScope
中的取消操作传播到ListenableFuture
。
版本 2.8.0-rc01
2022 年 12 月 7 日
发布了 androidx.work:work-*:2.8.0-rc01
。版本 2.8.0-rc01 中包含这些提交内容。
新功能
- 此版本没有任何新功能。这主要是版本递增
版本 2.8.0-beta02
2022 年 11 月 9 日
发布了 androidx.work:work-*:2.8.0-beta02
。版本 2.8.0-beta02 中包含这些提交内容。
bug 修复
- 修复了
WorkInfo
中的equals
方法,该方法以前不会考虑新的生成信息。(4977cc)
版本 2.8.0-beta01
2022 年 10 月 5 日
发布了 androidx.work:work-*:2.8.0-beta01
。版本 2.8.0-beta01 中包含这些提交内容。
bug 修复
- 修复了 GreedyScheduler 在工作器处于负载状态时会阻止其立即运行的问题。(I9686b、b/248111307)
版本 2.8.0-alpha04
2022 年 9 月 7 日
发布了 androidx.work:work-*:2.8.0-alpha04
。版本 2.8.0-alpha04 中包含这些提交内容。
API 变更
- 添加了
WorkerInfo.getGeneration()
和WorkerParameters.getGeneration()
,它们会返回工作器的代。如果工作器是使用ExistingPeriodicWorkPolicy.UPDATE
通过WorkManager.updateWork
或WorkManager.enqueueUniquePeriodicWork
进行更新的,便会有多代。请注意,如果工作器当前正在运行,并且在工作器执行期间发生了更新,此方法可能会根据当前正在运行的工作器的代返回较新的代。(I665c5、b/219446409)(I128a9、b/219446409) - 添加了
InitializationExceptionHandler
,这是一个异常处理程序,可用于确定在尝试初始化WorkManager
时是否存在问题。(I061de)
版本 2.8.0-alpha03
2022 年 8 月 10 日
发布了 androidx.work:work-*:2.8.0-alpha03
。版本 2.8.0-alpha03 中包含这些提交内容。
新功能
- 添加了以非干扰性方式更新
WorkRequests
的功能,以保持原始排队时间、工作链等。如需了解详情,请参阅WorkManager.updateWork
和ExistingPeriodicWorkPolicy.UPDATE
。
API 变更
- 添加了
WorkManager.updateWork
,用于更新工作并保持其原始排队时间和工作链。(I9a248、b/219446409) - 添加了
ExistingPeriodicWorkPolicy.UPDATE
。此政策允许按名称更新定期工作。它与现有的REPLACE
类似,但干扰性更小:它不会取消目前正在运行的工作器并且会保持排队时间 - 初始延迟和期间是根据原始排队时间(而非更新时间)计算的。废弃了REPLACE
,以缓解名称非常类似的REPLACE
和UPDATE
之间发生混淆的问题。如果您仍想保留REPLACE
的旧语义,则可以使用新添加的CANCEL_AND_REENQUEUE
,它与REPLACE
相同。(I985ed、b/219446409) - 添加了通过定义
SchedulingExceptionHandler
来拦截调度异常的功能。(I033eb) OneTimeWorkRequest
和PeriodicWorkRequest
的内嵌帮助程序已从androidx.work:work-runtime-ktx
移至androidx.work:work-runtime
(I0010f、b/209145335)
bug 修复
- 向在 SDK 33 及更高版本中需要授予 POST_NOTIFICATIONS 权限的 API 添加了
@RequiresPermission
。(Ie542e、b/238790278)
版本 2.8.0-alpha02
2022 年 4 月 6 日
发布了 androidx.work:work-*:2.8.0-alpha02
。版本 2.8.0-alpha02 中包含这些提交内容。
API 变更
- 现在可以直接构建约束条件而无需使用构建器,这对于 Kotlin 用户非常方便。(Idc390、b/137568653)
- 添加了检查
WorkManager
是否已初始化的功能。此外,还为库开发者添加了新的getConfiguration()
API,用于获取WorkManager
进行初始化时使用的配置。(I6eff3、b/212300336)
版本 2.8.0-alpha01
2022 年 1 月 12 日
发布了 androidx.work:work-*:2.8.0-alpha01
。版本 2.8.0-alpha01 中包含这些提交内容。
API 变更
- 添加了
WorkQuery.fromStates
、WorkQuery.fromUniqueWorkNames
和WorkQuery.fromTags
辅助方法,用于直接创建 WorkQuery。(If48f2、b/199919736) - 针对日后推出的 SDK 添加了实验性 BuildCompat 方法(Iafd82、b/207528937)
- 在
Worker
中添加了getForegroundInfo
。(Ic1ead) - 添加了
WorkQuery.fromIds
辅助方法,用于直接根据 ID 创建 WorkQuery。(Ie5bdf、b/199919736) - RxWorker 现在具有返回
Completable
的setForeground
,可用于代替返回ListenableFuture
的setForegroundInfoAsync
。(I85156) - 适用于 RxJava 2 的 RxWorker 现在具有返回
Single
的getForegroundInfo
,可用于代替返回ListenableFuture
的getForegroundInfoAsync
。(I21c91、b/203851459) - 适用于 RxJava 3 的 RxWorker 现在具有返回
Single
的getForegroundInfo
,可用于代替返回ListenableFuture
的getForegroundInfoAsync
。(I1ca8a) - RxWorker 现在具有返回
Completable
的setForeground
,可用于代替返回ListenableFuture
的setForegroundInfoAsync
。(I992a3、b/203851459)
bug 修复
- 使用
suspendCancellableCoroutine
时,将CoroutineScope
中的取消操作传播到ListenableFuture
。(I77e63)
版本 2.7
版本 2.7.1
2021 年 11 月 17 日
发布了 androidx.work:work-*:2.7.1
。版本 2.7.1 中包含这些提交内容。
bug 修复
- 使用
suspendCancellableCoroutine
时,CoroutineScope
中的取消操作会传播到ListenableFuture
。(I77e63) - 如果延迟的工作请求标记为“加急”,系统会立即抛出异常。bef1762
版本 2.7.0
2021 年 10 月 13 日
发布了 androidx.work:work-*:2.7.0
。版本 2.7.0 中包含这些提交内容。
自 2.6.0 以来的重要变更
WorkManager 引入了一个新的
WorkRequest.Builder.setExpedited(...)
API,以帮助处理 Android 12 中的前台服务限制。使用
setExpedited(...)
时,从 Android 12 开始,WorkManager 会在 JobScheduler 中委托加急作业,同时通过委托给前台服务来提供与更低版本的 Android 的向后兼容性。
版本 2.7.0-rc01
2021 年 9 月 29 日
发布了 androidx.work:work-*:2.7.0-rc01
。版本 2.7.0-rc01 中包含这些提交内容。
此版本与 androidx.work:work-*:2.7.0-beta01
完全相同。
版本 2.7.0-beta01
2021 年 9 月 1 日
发布了 androidx.work:work-*:2.7.0-beta01
。版本 2.7.0-beta01 中包含这些提交内容。
新功能
- 减少初始化 WorkManager 时的多进程 SQLite 争用。
API 变更
- 移除了
@ExperimentalExpeditedWork
API,因为适用于 Android 12 (S) 的底层平台 API 很稳定。(aosp/1792806)
bug 修复
- 为未实现
getForegroundInfoAsync()
的加急工作器提供了更清晰的错误消息。(aosp/1809376)
版本 2.7.0-alpha05
2021 年 7 月 21 日
发布了 androidx.work:work-*:2.7.0-alpha05
。版本 2.7.0-alpha05 中包含这些提交内容。
此版本还包含来自 WorkManager 2.6.0-beta02
版的 bug 修复。
版本 2.7.0-alpha04
2021 年 6 月 2 日
发布了 androidx.work:work-*:2.7.0-alpha04
。
此版本还包含 2.6.0-beta01 版本中的变更。
API 变更
ListenableWorker.setForegroundAsync()
已恢复使用。- 我们建议尽可能使用
WorkRequest.Builder.setExpedited(...)
API。为了更好地应对应用不受前台服务限制这一情况,开发者可以使用ListenableWorker.setForegroundAsync()
API。 - 如果调用
ListenableWorker.setForegroundAsync()
,当应用受到前台服务限制时,会抛出 ForegroundServiceStartNotAllowedException。
bug 修复
- 加急作业重新安排后,不再处于加急状态,而是变为常规作业。
版本 2.7.0-alpha03
2021 年 4 月 21 日
发布了 androidx.work:work-*:2.7.0-alpha03
。版本 2.7.0-alpha03 中包含这些提交内容。
新功能
移植自 WorkManager
2.6.0-alpha02
:添加了对可在任何进程中运行的工作器的支持。(Iaf200)移植自 WorkManager
2.6.0-alpha02
:添加了一个RemoteCoroutineWorker
,它是可绑定到远程进程的RemoteListenableWorker
实现。(I30578)
API 变更
- 移植自 WorkManager
2.6.0-alpha02
:添加了对TEMPORARILY_UNMETERED
网络约束条件的支持。(I08d5e) - 移植自 WorkManager
2.6.0-alpha02
:添加了针对setProgressAsync()
的多进程工作器支持。(Ib6d08) - 移植自 WorkManager
2.6.0-alpha02
:将WorkManagerInitializer
设为公开,以便其他androidx.startup.Initializer
可将其用作依赖项。(I5ab11)
Version 2.7.0-alpha02
2021 年 3 月 10 日
发布了 androidx.work:work-*:2.7.0-alpha02
。版本 2.7.0-alpha02 中包含这些提交内容。
bug 修复
- 明确指示
PendingIntent
可变性,以便解决在以 Android 12 为目标平台时的崩溃问题。 (b/180884673)
版本 2.7.0-alpha01
2021 年 2 月 18 日
发布了 androidx.work:work-*:2.7.0-alpha01
。版本 2.7.0-alpha01 中包含这些提交内容。
新功能
WorkManager 引入了新的
WorkRequest.Builder.setExpedited(...)
API,以将 Android 12 中的前台服务限制考虑在内。当应用在后台运行时,无法再启动前台服务。因此,为了更好地支持以前绑定到前台服务生命周期的长时间运行的工作,应用可以将
WorkRequest
标记为加急。此 API 用于替代现已弃用的
setForegroundAsync(...)
/setForeground(...)
API。使用
setExpedited(...)
时,从 Android 12 开始,WorkManager 会在JobScheduler
中委托加急作业,同时通过委托给前台服务来提供与更低版本的 Android 的向后兼容性。
API 变更
- 添加了对加急
WorkRequest
的支持。
版本 2.6.0
版本 2.6.0
2021 年 9 月 1 日
发布了 androidx.work:work-*:2.6.0
。版本 2.6.0 中包含这些提交内容。
自 2.5.0 以来的重要变更
WorkManager 现在使用
androidx.startup
来初始化 WorkManager。如果您使用的是tools:node="remove"
(即过去用于初始化 WorkManager 的ContentProvider
),那么您需要改为执行以下操作。<provider android:name="androidx.startup.InitializationProvider" android:authorities=\"${applicationId}.androidx-startup" android:exported="false" tools:node=\"merge"> <!-- If you are using androidx.startup to initialize other components --> <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
<!-- If you want to disable android.startup completely. --> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove" />
添加了对可在任何进程中运行的工作器的支持。(Iaf200)
添加了一个
RemoteCoroutineWorker
,它是可绑定到远程进程的 RemoteListenableWorker 实现。(I30578)
版本 2.6.0-rc01
2021 年 8 月 4 日
发布了 androidx.work:work-*:2.6.0-rc01
。版本 2.6.0-rc01 中包含这些提交内容。
此版本与 androidx.work:work-*:2.6.0-beta02
完全相同。
版本 2.6.0-beta02
2021 年 7 月 21 日
发布了 androidx.work:work-*:2.6.0-beta02
。版本 2.6.0-beta02 中包含这些提交内容。
bug 修复
RemoteWorkManager
现在可以与RemoteWorkManagerService
正确取消绑定,以便RemoteWorkManagerService
进行正确清理。aosp/1730694RemoteListenableWorker
现在可以与RemoteWorkerService
正确取消绑定,以便RemoteWorkerService
进行正确清理。aosp/1743817ForceStopRunnable
现在仅在主应用进程中运行。这是一项优化,可以避免使用多个进程的应用发生资源争用情况。aosp/1749180、aosp/1761729
版本 2.6.0-beta01
2021 年 6 月 2 日
发布了 androidx.work:work-*:2.6.0-beta01
。版本 2.6.0-beta01 中包含这些提交内容。
此版本仅包含一些细微的文档改进。此版本与 2.6.0-alpha02 几乎完全相同。
版本 2.6.0-alpha02
2021 年 4 月 21 日
发布了 androidx.work:work-*:2.6.0-alpha02
。版本 2.6.0-alpha02 中包含这些提交内容。
新功能
添加了对可在任何进程中运行的工作器的支持。(Iaf200)
添加了一个
RemoteCoroutineWorker
,它是可绑定到远程进程的RemoteListenableWorker
实现。(I30578)
API 变更
- 添加了对
TEMPORARILY_UNMETERED
网络约束条件的支持。(I08d5e) - 添加了针对
setProgressAsync()
的多进程工作器支持。(Ib6d08) - 将
WorkManagerInitializer
设为公开,以便其他androidx.startup.Initializer
可将其用作依赖项。(I5ab11)
版本 2.6.0-alpha01
2021 年 3 月 24 日
发布了 androidx.work:work-*:2.6.0-alpha01
。版本 2.6.0-alpha01 中包含这些提交内容。
新功能
WorkManager
现在使用androidx.startup
来初始化 WorkManager。 此前,此操作是由androidx.work.impl.WorkManagerInitializer
完成的。(aosp/1608813)如果您使用的是
tools:node="remove"
(即过去用于初始化进程生命周期的ContentProvider
),那么您需要改为执行以下操作。<provider android:name="androidx.startup.InitializationProvider" android:authorities=\"${applicationId}.androidx-startup" android:exported="false" tools:node=\"merge"> <!-- If you are using androidx.startup to initialize other components --> <meta-data android:name="androidx.work.impl.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
(或)
<!-- If you want to disable android.startup completely. --> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" tools:node="remove"> </provider>
API 变更
- 添加
Result.getOutputData()
API,该 API 会返回 ListenableWorker 的outputData
。(Ie51e3)
bug 修复
- 针对会导致在使用
AlarmManager
API 时抛出SecurityException
的 OEM bug 添加了解决方法。(aosp/1587518)
版本 2.5.0
版本 2.5.0
2021 年 1 月 27 日
发布了 androidx.work:work-*:2.5.0
。版本 2.5.0 中包含这些提交内容。
自 2.4.0 以来的重要变更
- 为使用多个进程的应用新增了
:work:work-multiprocess
工件。通过将工作请求调度统一到单个进程中,可以提升性能。- 只需定义对
implementation "androidx.work:work-multiprocess:2.5.0"
的依赖项,即可使用work-multiprocess
- 使用 Configuration.Builder.setDefaultProcessName(String) 指定主进程。
- 如果使用
work-multiprocess
,则还需要使用 RemoteWorkManager 来管理WorkRequest
。RemoteWorkManager 始终会与指定进程通信。此外,进程内调度程序也会在指定进程中运行。
- 只需定义对
- 有时,
ActivityManager
无法实例化JobService
实例来启动作业。这会导致底层作业在出现平台错误时被静默丢弃。WorkManager
现在可确保,在通过协调作业初始化Application
时,每个WorkRequest
都有后备作业。这会极大地提高作业执行的可靠性。(b/172475041、aosp/1489577) WorkManager
会通过缩减在WorkRequest
完成后跟踪WorkRequest
的缓冲时长来限制数据库的增长。该时长之前是7
天,现在已缩减至1
天加上 keepResultsForAtLeast 时长。(aosp/1419708)TestListenableWorkerBuilder
现在支持扩展ListenableWorker
的具体化类,以使测试变得更容易。(aosp/1443299、b/169787349)- 现在,在使用 Android Studio Arctic Fox 时,可使用 WorkManager Inspector。
版本 2.5.0-rc01
2021 年 1 月 13 日
发布了 androidx.work:work-*:2.5.0-rc01
。版本 2.5.0-rc01 中包含这些提交内容。
bug 修复
- 修复了以下 bug:使用基于
WorkQuery
的 API 时,getWorkInfosLiveData
无法在实体更新后正确失效。(aosp/1540566、b/173769028) - 修复了以下 bug:数据库事务在极少数情况下未标记为成功。此问题会导致部分 Motorola 设备出现问题。(aosp/1535368、b/175944460)
- 修复了一个 bug,以便在尝试与已终止的进程取消绑定时忽略
NoSuchElementException
。(aosp/1530589) - 改进了
ConstraintTrackingWorker
,以便仅停止尚未停止的ListenableWorker
。(aosp/1496844、b/172946965) - 更新了 androidx.work 库以便以 Java 8 为目标 (Ibd2f2)
版本 2.5.0-beta02
2020 年 12 月 2 日
发布了 androidx.work:work-*:2.5.0-beta02
。版本 2.5.0-beta02 中包含这些提交内容。
bug 修复
- 修复了
androidx.work:work-multiprocess
中的一个 bug:WorkManager 在尝试绑定到指定进程时无意中阻塞了发起调用的线程。(aosp/1475538) - 修复了以下 bug:未正确地协调
PeriodicWorkRequest
。(b/172475041、aosp/1489577) - 添加了针对以下平台 bug 的解决方法:使用
setForeground*
API 时会导致前台服务停止运行。(b/170924044、aosp/1489901)
版本 2.5.0-beta01
2020 年 10 月 28 日
发布了 androidx.work:work-*:2.5.0-beta01
。版本 2.5.0-beta01 中包含这些提交内容。
新功能
WorkManager
会自动限制可被进程内调度程序接收的WorkRequest
数量。这些请求仍会按 FIFO 顺序执行。(aosp/1455228)- 当应用的数据存储区处于不良状态时,
WorkManager
会尝试进行恢复。(aosp/1463103)
bug 修复
- 当
ListenableWorker
中断时,立即将其标记为ENQUEUED
,以便随后可以重新调度它们。(aosp/1455618、b/170273988)
版本 2.5.0-alpha03
2020 年 10 月 14 日
发布了 androidx.work:work-*:2.5.0-alpha03
。版本 2.5.0-alpha03 中包含这些提交内容
API 变更
TestListenableWorkerBuilder
和TestWorkerBuilder
不使用原始类型。(I883ad、b/169787349)
bug 修复
- 使用
ApplicationInfo
确定默认应用进程的名称。(b/168716641、aosp/1429950) - 修复了
RemoteWorkManager
和RemoteWorkContinuation
的可见性规则。这些 API 不再标记为@Restricted
。(aosp/1432091) - 修复了
:work:work-multiprocess
的 proguard 规则。(aosp/1432091) - 改进绑定到前台服务的长时间运行工作的通知生命周期。(b/168502234、aosp/1431331)
版本 2.5.0-alpha02
2020 年 9 月 16 日
发布了 androidx.work:work-*:2.5.0-alpha02
。版本 2.5.0-alpha02 中包含这些提交内容。
新功能
- 为 WorkQuery 添加了 API,以便能够使用
id
查询WorkInfo
。(aosp/1412372、b/157335295) - WorkManager 可以通过新工件 (
androidx.work:work-multiprocess:*
) 更好地支持使用多个进程的应用。此新工件有助于解决大型应用遇到的一些问题,其中包括:- WorkManager 通常在每个应用进程中都需要进行初始化。这种情况不太理想,因为这会增加 SQLite 争用,进而导致其他问题。现在,WorkManager 中新增了一些 API,这些 API 可以使用
Configuration#setDefaultProcessName(processName)
指定主应用进程。processName
是完全限定的进程名称,类似于packageName:processName
(例如com.example:remote
)。 - 新增了一组 API:用于
enqueue
、cancel
和query
工作请求的RemoteWorkManager
和RemoteWorkContinuation
。为了避免多个进程间出现 SQLite 争用,这些 API 不包含LiveData
变体。对enqueue
、cancel
和query
的所有调用都将使用 AIDL 转发到primary
应用进程,并返回连贯的ListenableFuture
。(aosp/1392657、aosp/1411210、aosp/1412215、aosp/1417713)
- WorkManager 通常在每个应用进程中都需要进行初始化。这种情况不太理想,因为这会增加 SQLite 争用,进而导致其他问题。现在,WorkManager 中新增了一些 API,这些 API 可以使用
API 变更
- 如果已经完成的
WorkRequest
没有任何未完成的依赖项,WorkManager 现在会更激进地删除这些工作请求。缓冲时长从7
天更改为1
天。(aosp/1419708)
bug 修复
- 现在,WorkManager 会主动协调作业,以便在初始化
WorkManager
时保持WorkRequest
和JobScheduler
作业同步。(aosp/1412794、b/166292069)
版本 2.5.0-alpha01
2020 年 8 月 19 日
发布了 androidx.work:work-*:2.5.0-alpha01
。版本 2.5.0-alpha01 中包含这些提交内容。
新功能
- 更改了内部 API,使我们可以随着
WorkManager
的不断改进提供更好的工具。敬请关注更多更新。
bug 修复
- 对在某些设备上跟踪网络状态时出现的
SecurityException
进行了处理。(aosp/1396969)
外部贡献
- Zac Sweers 已更正
ArrayCreatingInputMerger
的文档 (github/43)。
版本 2.4.0
版本 2.4.0
2020 年 7 月 22 日
发布了 androidx.work:work-*:2.4.0
。版本 2.4.0 中包含这些提交内容。
自 2.3.0 以来的重要变更
WorkManager
进程内调度程序现在功能更强大。之前,进程内Scheduler
只会考虑执行未延迟且其约束条件得到满足的工作。现在,进程内调度程序会跟踪可能在未来执行的WorkRequest
,包括 PeriodicWorkRequest。进程内Scheduler
也不会遵循调度限制(但仍会受 WorkManager 使用的Executor
的大小限制)。这意味着,现在应用在前台运行时,可以执行更多 WorkRequest。为了在前台管理延迟的工作的执行,WorkManager
还引入了一个新的可配置RunnableScheduler
。(aosp/1185778)- WorkManager 现在支持 RxJava 3。如需使用 RxJava 3,您应该添加以下依赖项:
implementation "androidx.work:work-rxjava3:2.4.0"
。(aosp/1277904) - 增加了使用
WorkQuery
查询WorkInfo
的功能。如果开发者想通过多个属性的组合来查询WorkInfo
,这会非常有用。如需了解详情,请查看WorkQuery.Builder.fromStates(...)
、WorkQuery.Builder. fromTags(...)
或WorkQuery.Builder.fromUniqueWorkNames(...)
。(aosp/1253230、b/143847546) 添加了使用以下命令从
WorkManager
请求诊断信息的功能:adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>"
该功能可提供许多有用信息,包括:
- 在过去 24 小时内完成的 WorkRequest。
- 目前正在运行的 WorkRequest。
- 预定运行的 WorkRequest。(aosp/1235501)
添加了
ExistingWorkPolicy.APPEND_OR_REPLACE
,它与APPEND
类似,但会替换已取消或不满足前提条件的链。(b/134613984、aosp/1199640)现在可以添加自定义
RunnableScheduler
以跟踪需要在将来执行的 WorkRequest。进程内调度程序会用到此功能。(aosp/1203944)添加了对以下情形的支持:在使用
DelegatingWorkerFactory
时,动态添加要委托的 Factory。(b/156289105、aosp/1309745)使对
BATTERY_NOT_LOW
约束条件的跟踪与本平台更贴近。(aosp/1312583)现在,进程内调度程序会使用更好的 API 来确定进程的名称。这有助于更好地支持使用多个进程的应用。(aosp/1324732)
确保执行以下操作的新 lint 规则:
- 在使用
setForegroundAsync()
API 时使用正确的foregroundServiceType
。(b/147873061、aosp/1215915) - 指定 WorkManager 在直接使用 JobService API 时应使用的 JobScheduler ID。aosp/1223567
- 新增了一个 lint 规则,该规则可确保使用默认
WorkerFactory
时ListenableWorker
实现现在处于public
状态。(aosp/1291262)
- 在使用
现在,未在完成
ListenableWorker
之前完成的setForegroundAsync()
调用将通过返回的ListenableFuture
上的IllegalStateException
收到信号。(aosp/1262743)修正了某个前台
Worker
运行中断后ForegroundService
不停止运行的错误。(b/155579898、aosp/1302153)修正了以下错误:
WorkManager
会尝试执行已绑定到一项前台服务的Worker
的多个实例(b/156310133、aosp/1309853)
版本 2.4.0-rc01
2020 年 6 月 24 日
发布了 androidx.work:work-*:2.4.0-rc01
。版本 2.4.0-rc01 中包含这些提交内容。
bug 修复
- 现在,进程内调度程序会使用更好的 API 来确定进程的名称。这有助于更好地支持使用多个进程的应用。(aosp/1324732)
版本 2.4.0-beta01
2020 年 5 月 20 日
发布了 androidx.work:work-gcm:2.4.0-beta01
、androidx.work:work-runtime:2.4.0-beta01
、androidx.work:work-runtime-ktx:2.4.0-beta01
、androidx.work:work-rxjava2:2.4.0-beta01
和 androidx.work:work-testing:2.4.0-beta01
。版本 2.4.0-beta01 包含这些提交内容。
bug 修复
- 修正了某个前台
Worker
运行中断后ForegroundService
不停止运行的错误。(b/155579898、aosp/1302153) - 修正了以下错误:
WorkManager
会尝试执行已绑定到一项前台服务的Worker
的多个实例(b/156310133、aosp/1309853) - 添加了对以下情形的支持:在使用
DelegatingWorkerFactory
时,动态添加要委托的 Factory。(b/156289105、aosp/1309745) - 使对
BATTERY_NOT_LOW
约束条件的跟踪与本平台更贴近。(aosp/1312583)
版本 2.4.0-alpha03
2020 年 4 月 29 日
发布了 androidx.work:work-*:2.4.0-alpha03
。版本 2.4.0-alpha03 中包含这些提交内容。
新功能
- WorkManager 现在支持 RxJava 3。如需使用 RxJava 3,您应该添加以下依赖项:
implementation "androidx.work:work-rxjava3:2.4.0-alpha03"
。(aosp/1277904) - 新增了一个 lint 规则,该规则可确保使用默认
WorkerFactory
时ListenableWorker
实现现在处于public
状态。(aosp/1291262)
API 变更
- 现在,在
ListenableWorker
完成执行后调用setProgressAsync()
会通过ListenableFuture
发出Exception
信号。(aosp/1285494) WorkQuery.Builder
现已标记为final
。(aosp/1275037)WorkQuery.Builder
工厂方法withStates
、withTags
和withUniqueWorkNames
已分别重命名为fromStates
、fromTags
和fromUniqueWorkNames
。(aosp/1280287)
bug 修复
- 忽略了在跟踪设备的网络状态时出现的
SecurityException
。(b/153246136、aosp/1280813)
版本 2.4.0-alpha02
2020 年 4 月 1 日
发布了 androidx.work:work-*:2.4.0-alpha02
。版本 2.4.0-alpha02 中包含这些提交内容。
新功能
- 添加了新的 lint 规则,该规则会在
WorkRequest
同时需要Constraints.setRequiresCharging(...)
和Constraints.setRequiresDeviceIdle(...)
时发出警告。有些设备永远不会同时处于正在充电和闲置状态。因此,此类请求的执行频率会低于预期。(aosp/1253840)
API 变更
增加了使用
WorkQuery
查询WorkInfo
的功能。如果开发者想通过多个属性的组合来查询WorkInfo
,这会非常有用。如需了解详情,请查看WorkQuery.Builder withStates(...)
、WorkQuery.Builder withTags(...)
或WorkQuery.Builder withUniqueWorkNames(...)
。(aosp/1253230、b/143847546)现在,未在完成
ListenableWorker
之前完成的setForegroundAsync()
调用将通过返回的ListenableFuture
上的IllegalStateException
收到信号。(aosp/1262743)
bug 修复
- 修复了用于检查
PeriodicWorkRequest
的无效间隔时长的 lint 规则。(aosp/1254846、b/152606442)
版本 2.4.0-alpha01
2020 年 3 月 4 日
发布了 androidx.work:work-*:2.4.0-alpha01
。版本 2.4.0-alpha01 中包含这些提交内容。
新功能
WorkManager
进程内调度程序现在功能更强大。之前,进程内调度程序仅考虑执行未延迟且满足约束条件的工作。现在,进程内调度程序会跟踪可能在未来执行的WorkRequest
,包括PeriodicWorkRequest
。进程内调度程序也不会遵循调度限制(但仍会受 WorkManager 使用的Executor
的大小限制)。这意味着,现在应用在前台运行时,可以执行更多WorkRequest
。(aosp/1185778)添加了使用
adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>"
从 WorkManager 请求诊断信息的功能。该功能可提供许多有用信息,包括:- 在过去 24 小时内完成的 WorkRequest。
- 目前正在运行的 WorkRequest。
- 预定运行的 WorkRequest。(aosp/1235501)
确保执行以下操作的新 lint 规则:
- 在使用
setForegroundAsync()
API 时使用正确的foregroundServiceType
。(b/147873061、aosp/1215915) - 指定
WorkManager
在直接使用JobService
API 时,应使用的JobScheduler
ID。(aosp/1223567)
- 在使用
API 变更
添加了
ExistingWorkPolicy.APPEND_OR_REPLACE
,它与APPEND
类似,但会替换已取消或不满足前提条件的链。(b/134613984、aosp/1199640)现在可以添加自定义
RunnableScheduler
以跟踪需要在将来执行的WorkRequest
。进程内调度程序会用到此功能。(aosp/1203944)
bug 修复
- 弃用了
RxWorker
中的setProgress()
,因为此方法之前会返回一种无法实现的类型Single<Void>
。新增了一个 API,即setCompletableProgress()
,它会返回Completable
;并且添加了新的 Lint 规则,以帮助迁移到新的 API。(b/150080946、aosp/1242665)
版本 2.3.4
版本 2.3.4
2020 年 3 月 18 日
发布了 androidx.work:work-*:2.3.4
。版本 2.3.4 中包含这些提交内容。
bug 修复
- 修复了一个错误,该错误会导致长时间运行的
Worker
的多个实例在超过 10 分钟执行时间窗口之后运行。(aosp/1247484、b/150553353) - 修复了 WorkManager 的 lint
IssueRegistry
。感谢 Slack 的 @ZacSweers 对此做出的贡献。(aosp/1217923)
版本 2.3.3
版本 2.3.3
2020 年 3 月 4 日
发布了 androidx.work:work-*:2.3.3
。版本 2.3.3 中包含这些提交内容。
bug 修复
- 修复了
Worker
在中断后无法重新正确调度的错误。(b/150325687、aosp/1246571)
版本 2.3.2
版本 2.3.2
2020 年 2 月 19 日
发布了 androidx.work:work-*:2.3.2
。版本 2.3.2 中包含这些提交内容。
bug 修复
- 修复了 WorkManager 在极少数情况下会超出 JobScheduler 中的 100 个作业限制的问题。(aosp/1226859、b/149092520)
- 修复了 ConstraintController 中的竞态条件问题。(aosp/1220100)
- 针对长时间运行的 Worker,改进了前台服务的生命周期管理。(aosp/1226295)
- 针对长时间运行的 Worker,改进了 Worker 取消时的通知取消管理。(aosp/1228346)
版本 2.3.1
版本 2.3.1
2020 年 2 月 5 日
发布了 androidx.work:work-*:2.3.1
。版本 2.3.1 中包含这些提交内容。
bug 修复
- 针对长时间运行的
Worker
(在前台Service
处于活跃状态时运行),改进了Notification
的生命周期管理。(aosp/1218539、b/147249312) WorkManager
现在依赖于androidx.sqlite:sqlite-framework:2.1.0
稳定版。(aosp/1217729)- 添加了 lint 规则,确保在
ForegroundInfo
中使用foregroundServiceType
时,在AndroidManifest.xml
中指定foregroundServiceType
。(aosp/1214207、b/147873061)
版本 2.3.0
版本 2.3.0
2020 年 1 月 22 日
发布了 androidx.work:work-*:2.3.0
,该版本与 2.3.0-rc01
相比没有变化。版本 2.3.0 中包含这些提交内容。
自 2.2.0 以来的重要变更
- 通过
ListenableWorker#setForegroundAsync()
实现了对长时间运行的工作或重要工作的支持。 - 通过
ListenableWorker#setProgressAsync()
实现了对 Worker Progress 的支持。 - WorkManager 现在可将额外的 lint 规则打包到库中,从而有助于及早发现错误。
版本 2.3.0-rc01
2020 年 1 月 8 日
发布了 androidx.work:work-*:2.3.0-rc01
。版本 2.3.0-rc01 中包含这些提交内容。
此版本与 2.3.0-beta02
完全相同
bug 修复
work-testing
工件现在可定义依赖于work-runtime-ktx
的api
。(aosp/1194410)
版本 2.3.0-beta02
2019 年 12 月 18 日
发布了 androidx.work:work-*:2.3.0-beta02
。版本 2.3.0-beta02 中包含这些提交内容。
新功能
- 为不可恢复的 SQLite 异常添加了更清晰的错误消息。(aosp/1185777)
- 添加了一个 lint 规则,该规则可确保在使用按需初始化时从
AndroidManifest.xml
中移除内容提供器androidx.work.impl.WorkManagerInitializer
。(aosp/1167007) - 添加了一个 lint 警告,当将
enqueue()
用于PeriodicWorkRequest
而非enqueueUniquePeriodicWork()
时,系统会就会发出此警告。(aosp/1166032)
API 变更
ForegroundInfo
现在要求您指定要与ListenableWorker.setForegroundAsync()
一起使用的notificationId
。这是一项重大变更。 这样,您就可以同时运行多个长时间运行的Worker
。此外,WorkManager
还可更好地管理所提供的Notification
的生命周期。(b/145473554、aosp/1181208、asop/1181216、asop/1183577)
bug 修复
- 修复了 AlarmManager 实现中无法正确清除警报的 bug。(aosp/1156444)
- 修复了以下错误:在
WorkRequest
列表为空时,会导致构建错误的WorkContinuation
链。(b/142835274、aosp/1157051)
依赖项变更
- WorkManager 现在使用 Room 2.2.2。
版本 2.3.0-beta01
2019 年 11 月 20 日
发布了 androidx.work:work-*:2.3.0-beta01
。版本 2.3.0-beta01 中包含这些提交内容。
新功能
- 新增了一个 lint 规则,该规则可防止由于在使用按需初始化时错误地实现
androidx.work.Configuration.Provider
而导致的开发者错误。aosp/1164559
版本 2.3.0-alpha03
2019 年 10 月 23 日
发布了 androidx.work:work-*:2.3.0-alpha03
。版本 2.3.0-alpha03 中包含这些提交内容。
新功能
- 添加了
WorkManager.createCancelPendingIntent()
API,使得无需在AndroidManifest.xml
中注册其他组件即可轻松取消WorkRequest
。使用此 API,可以非常轻松地从Notification
取消WorkRequest
。我们预计这将与 2.3.0 中的新前台 API 配对使用。 - 现在,WorkManager 依赖于
androidx.room:*:2.2.0
稳定版。
API 变更
- 已将
ForegroundInfo.getNotificationType()
重命名为ForegroundInfo.getForegroundServiceType()
,以便与底层平台 API 更加一致。(b/142729893、aosp/1143316)
bug 修复
- 修复了由于在事务之外对
setTransactionSuccessful()
进行不必要的调用而导致的 bug。在极少数的迁移过程中会发生这种情况。(b/142580433、aosp/1141737)
版本 2.3.0-alpha02
2019 年 10 月 9 日
发布了 androidx.work:work-*:2.3.0-alpha02
。版本 2.3.0-alpha02 中包含这些提交内容。
新功能
- WorkManager 现在可运行那些应由操作系统保持活跃状态的长时间工作或重要工作。如需了解详情,请参阅
ListenableWorker#setForegroundAsync()
(或 Kotlin 的CoroutineWorker#setForeground()
)。(aosp/1133636)
API 变更
Data
中的containsKey
API 已重命名为hasKeyWithValueOfType
。ktx
库中的相应扩展方法也已重命名。(b/141916545)
bug 修复
- 当排队的
WorkRequest
的数量接近调度限制时,WorkManager 会公平地调度各项工作。(aosp/1105766) - 仅当工作尚未完成时,WorkManager 才会调用
ListenableWorker#onStopped()
。(b/140055777) - 现在,当 Worker 中断或达到其终止状态时,WorkManager 会移除进度信息。(aosp/1114572)
Data
现在有更实用的toString()
表示法。(b/140945323)Data
现在有更好的equals()
方法。对于Array
类型,它还支持deepEquals
。(b/140922528)- 现在,WorkManager 将其内部数据库和首选项文件存储在无备份目录中。(b/114808216)
版本 2.3.0-alpha01
2019 年 8 月 22 日
发布了 androidx.work:work-*:2.3.September 5, 20190-alpha01
。点击此处可查看此版本中包含的提交内容。
新功能
ListenableWorker
现在可以通过setProgressAsync()
API 设置进度。此外,还在CoroutineWorker
中添加了相应的suspend
-ingsetProgress
API,在RxWorker
中添加了setProgress
,后者会返回Single<Void>
。借助这些新的 API,Worker 可以通过具有相应的getProgress
API 的WorkInfo
传达进度信息。(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
取消和ListenableWorker
中的onStopped()
回调进行了文档更新。(b/138413671)
bug 修复
- 进程内调度程序现在会忽略具有
idle
约束的WorkRequest
。现在,仅当设备实际处于idle
状态时,JobScheduler
才会接收这些请求。(aosp/1089779) - 现在,
TestScheduler
会在测试中为其内部任务执行程序正确使用指定的Executor
。(aosp/1090749)
版本 2.2.0
版本 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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 修复了 AlarmManager 实现中的一个 bug,在极少数情况下该 bug 会导致服务过早关闭,致使出现
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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 移除了在
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。
bug 修复
- 修复了在 Nvidia Shield K1 平板电脑上跟踪网络状态时出现的
IllegalArgumentException
。(aosp/1010188)
版本 2.1.0
版本 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.gradle
:kotlinOptions { jvmTarget = "1.8" }
- 为 WorkManager 添加了按需初始化功能,这样将仅在引用 WorkManager 时创建该组件。b/127497100 如需设置您的项目以进行按需初始化,请执行以下操作:
- 停用自动初始化程序。
- 在您的自定义
Application
对象上实现Configuration.Provider
。 - 将
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
工件中的TestWorkerBuilder
和TestListenableWorkerBuilder
创建可执行单元测试的Worker
和ListenableWorker
类的功能。- 请注意,
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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 修复了在备份进行中使用
JobScheduler
执行作业时会导致应用崩溃的问题 b/135858602。
版本 2.1.0-beta02
2019 年 6 月 20 日
发布了 androidx.work:work-*:2.1.0-beta02
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 现在,
TestListenableWorkerBuilder
在创建ListenableWorker
的实例时会使用正确的WorkerFactory
。b/135275844 - 修复了由于进程终止而导致在
WorkRequest
的执行窗口中偏移的 bug。b/135272196
版本 2.1.0-beta01
2019 年 6 月 13 日
发布了 androidx.work:work-*:2.1.0-beta01
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 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
。
bug 修复
- 围绕
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 如需设置您的项目以进行按需初始化,请执行以下操作:
- 停用自动初始化程序。
- 在您的自定义
Application
对象上实现Configuration.Provider
。 - 将
WorkManager.getInstance()
的所有引用更改为WorkManager.getInstance(Context)
。在进行这项更改的过程中,我们已弃用WorkManager.getInstance()
。即使您不进行按需初始化,调用新的WorkManager.getInstance(Context)
替代方法也始终是更安全的做法。
- 添加了使用
work-testing
工件中的TestWorkerBuilder
和TestListenableWorkerBuilder
创建可执行单元测试的Worker
和ListenableWorker
类的功能。- 请注意,
work-testing
现在将 Kotlin 作为依赖项引入,并且默认情况下添加几个 Kotlin 扩展。
- 请注意,
- 向
WorkInfo
中添加了运行尝试计数。b/127290461 Data
类型现在可以存储和检索字节和字节数组。这不会更改Data
对象的最大大小。- 弃用了
CoroutineWorker.coroutineContext
。此字段以前错误地输入为CoroutineDispatcher
;您应该不再需要它,因为您可以在挂起函数的主体中自行转到所需的 coroutineContext。 RxWorker.createWork()
和RxWorker.getBackgroundScheduler()
现在带有@NonNull
返回类型注释。
版本 2.0.1
版本 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。此版本修复了一些 bug。对于旧版 1.x 用户,其中一些更改也会出现在 1.0.1-rc01 中。
bug 修复
- 现在可利用 WorkManager 正常运行 Robolectric 测试。b/122553577
- 修复了在 JobScheduler 之前的 API 上未清理约束跟踪时出现的极端情况下的崩溃问题。b/129226383
- 修复了处理长工作链时出现的
StackOverflowError
。b/129091233 - 围绕
PeriodicWorkRequest
更新了文档,指明 API 23 不支持弹性时间。 - 修复了 Kotlin 文档中一些损坏的链接。
版本 2.0.0
版本 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 将只在有限的时间内收到重大 bug 修复。
版本 2.0.0-rc01
2019 年 3 月 7 日
发布了 WorkManager 2.0.0-rc01。此版本与 1.0.0 稳定版完全相同,但具有 AndroidX 依赖项。一旦此版本升级到 2.0.0 稳定版,您就应添加此版本,而旧版 1.x 将只会接收到一些重大问题修复。所有活跃的开发都将以 2.x 为目标版本。
AndroidX 之前的依赖项
参考文档:Java
Groovy
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" }
Kotlin
dependencies { val 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
版本 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。此版本修复了一些 bug。
bug 修复
- 现在可利用 WorkManager 正常运行 Robolectric 测试。b/122553577
- 修复了在 JobScheduler 之前的 API 上未清理约束跟踪时出现的极端情况下的崩溃问题。b/129226383
- 修复了处理长工作链时出现的
StackOverflowError
。b/129091233
版本 1.0.0
版本 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 稳定版的第二个候选版本。此版本修复了 2 个 bug。
bug 修复
现在,在应用崩溃后会正确调度
Worker
。b/124546316现在,抛出未检查的
Exception
的Worker
已正确标记为FAILED
且不再使应用进程崩溃。
版本 1.0.0-rc01
2019 年 2 月 14 日
这是 WorkManager 的 1.0.0 稳定版的一个候选版本。此版本修复了一个问题。
bug 修复
- 现在,基于 AlarmManager 的实现会正确遵循 PeriodicWorkRequest 的
flex
窗口。b/124274584
版本 1.0.0-beta05
2019 年 2 月 6 日
此版本修复了一些 bug。
bug 修复
- 修复了在 API 23 上使用
JobScheduler.getPendingJob(...)
的问题。b/123893059 - 修复了搭载 Android 5.1(API 级别 22)或更低版本的设备上出现的
NullPointerException
。b/123835104
版本 1.0.0-beta04
2019 年 2 月 4 日
此版本修复了一些 bug。
bug 修复
- 针对基于 AlarmManager 的实现改进了 PeriodicWork 的调度。
- 修复了使用基于 AlarmManager 的实现时 WorkManager 无法正确跟踪约束的问题。b/123379508
- 修复了使用基于 AlarmManager 的实现时 WorkManager 无法在进程终止后重试工作的问题。b/123329850
- 修复了使用基于 AlarmManager 的实现时会导致 WorkManager 泄露 Wakelock 的问题。
版本 1.0.0-beta03
2019 年 1 月 25 日
此版本修复了一些 bug。
bug 修复
- 我们引入了回归
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 日
此版本修复了一些 bug。
bug 修复
- 修复了极端情况下的一个问题,即在搭载 Android 6.0(API 级别 23)的设备上,定期工作可能会在每个间隔内运行多次。b/121998363
- 修复了搭载 Android 5.1(API 级别 22)或更低版本的设备上出现的
ConcurrentModificationException
。b/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 保持稳定(除非出现严重问题)。此版本修复了一些 bug。
bug 修复
- 如果之前取消的工作是已成功完成的父级工作的子级,则该子级将不再运行。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 更改”部分。此版本很可能会作为我们的第一个 Beta 版发布。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
而不是Payload
。Worker
没有用于输出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
类以及引用它的方法不再可供公共使用。这是一项重大变更。- 在
WorkManager
、WorkContinuation
和OneTimeWorkRequest
中移除了 varargs 方法的剩余部分以简化 API。要解决任何编译问题,您可以使用Arrays.asList(...)
封装现有的 varargs。我们仍然会包含每个方法的单参数版本。这是一项重大变更。 - 移除了
WorkContinuation.combine(OneTimeWorkRequest, *)
变体。它们之前呈现的 API 令人困惑,而现有的combine
方法更容易理解。这是一项重大变更。
bug 修复
- 现在,在恢复已执行任务的终止进程时,版本低于 Marshmallow 的实现更加可靠。
- 通过
observeForever
观察到的LiveData
会通过 WorkManager 进行跟踪。这是 Room 库修复的向后移植。b/74477406 - 如果序列化对象超过其大小上限,
Data.Builder.build()
现在会抛出异常。之前这种情况只发生在后台线程,因此您无法正确处理这种问题。 - 进一步区分了“停止”操作和“取消”操作,
getWorkInfoById()
将在ListenableWorker.onStopped()
期间返回具有CANCELLED
State
的WorkInfo
。 - 在
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
而不是Payload
。Worker
没有用于输出Data
的 getter 和 setter 方法。 - 添加了
Operation.await()
和ListenableFuture.await()
Kotlin 扩展方法。 - 已将
Operation.getException()
重命名为Operation.getThrowable()
。 ContentUriTriggers
类以及引用它的方法不再可供公共使用。- 在
WorkManager
、WorkContinuation
和OneTimeWorkRequest
中移除了 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
的enqueue
和cancel
方法的所有变体现在都会返回一个新的Operation
类型。这是一项重大变更。 enqueue
的所有变体都不再接受WorkRequest
的 varargs。这是一项重大变更。请改用集合。您可以使用Arrays.asList()
修改现有代码。我们这样做是为了缩减 API 表面和方法计数。- 在一个进程中尝试多次
initialize
WorkManager
现在会导致出现IllegalStateException
。这是一项重大变更。
bug 修复
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()
。- 针对
WorkManager
的enqueue
和cancel
方法的所有变体现在都会返回一个新的Operation
类型。 enqueue
的所有变体都不再接受WorkRequest
的 varargs。- 在一个进程中尝试多次
initialize
WorkManager
现在会导致出现IllegalStateException
。
版本 1.0.0-alpha10
2018 年 10 月 11 日
此版本支持开发者控制的异步工作。此版本包含重要的 API 更改,请参阅下面的“重要 API 更改”部分。
我们预计 WorkManager 正在进入其 alpha 版本期间的最后阶段。我们希望在 Beta 版中使 API 变得稳定,因此请花一些时间在我们的问题跟踪器上提交反馈。
API 变更
- 移除了所有之前的
deprecated
方法和类,尤其是默认的Worker
构造函数。这是一项重要的 API 变更。 NonBlockingWorker
已重命名为ListenableWorker
,它现在是一个未隐藏的公共类,随时可供使用。- 通过
ListenableWorker
可以访问一个在主线程上调用的抽象方法,即ListenableFuture<Payload> onStartWork()
。异步启动和处理工作由您负责执行。完成后,您应该适当地更新ListenableFuture
。ListenableFuture
的参考实现在alpha02
的Futures
软件包中提供(请参阅下面的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 更改。
- 您现在可以使用
bug 修复
- 修复了 alpha09 中关于重复的
androidx-annotations.pro
文件的已知问题。您可以通过从 Gradle 文件中删除exclude 'META-INF/proguard/androidx-annotations.pro'
来移除之前的版本说明中的解决方法。 - 添加了 ProGuard 配置以保留新的
Worker
构造函数。b/116296569 - 修复了在对工作进行
REPLACE
处理后的竞争条件下潜在的NullPointerException
问题。b/116253486 和 b/116677275 WorkContinuation.combine()
现在接受一个或更多WorkContinuation
,而不是两个或更多。b/117266752
重要 API 更改
- 移除了所有之前的
deprecated
方法和类,尤其是默认的Worker
构造函数。 - 将接口
WorkerFactory
和具体实现DefaultWorkerFactory
合并到了一个名为WorkerFactory
的抽象类中。 - 移除了
WorkManager.synchronous()
和WorkContinuation.synchronous()
。 WorkManager.getStatus*()
方法现在返回ListenableFuture
。WorkManager.getStatus*LiveData()
返回LiveData
。
版本 1.0.0-alpha09
2018 年 9 月 19 日
已知问题
如果您遇到以下问题:“发现多个文件的路径与操作系统无关‘META-INF/proguard/androidx-annotations.pro’”,请在 Gradle 文件中添加以下内容来临时解决这个问题(我们将在 alpha10 中解决此问题):
Groovy
android { packagingOptions { exclude 'META-INF/proguard/androidx-annotations.pro' } }
Kotlin
android { packagingOptions { exclude("META-INF/proguard/androidx-annotations.pro") } }
bug 修复
- 添加了“100 个作业”错误所需的另一个修复程序。b/115560696
- 针对由于竞争条件而导致的外键约束错误添加了一些修复程序。b/114705286
- 将
ConstraintTrackingWorker.onStopped(boolean)
调用委托给了底层Worker
。b/114125093 - 针对 Firebase JobDispatcher 强制采用正确的最小退避延迟。b/113304626
- 改进了库的内部线程保证。
- 更正了与
LiveData
内部重复数据删除有关的潜在问题。
API 变更
- 您现在可以通过将
WorkerFactory
指定为WorkManager.Configuration
的一部分,在运行时创建自己的Worker
实例。后备出厂设置为DefaultWorkerFactory
,它与之前版本的 WorkManager 的行为相符。Worker
和NonBlockingWorker
的默认构造函数现在标记为已弃用。请使用新的构造函数 (Worker(Context, WorkerParameters)
) 并调用super(Context, WorkerParameters)
,我们将在未来版本的 WorkManager 中移除默认构造函数。
- 我们在内部已开始使用新的
ListenableFuture
工件(没有 Guava 依赖项)。我们将在即将发布的版本中向 API 引入 ListenableFutures。此更改将支持最终取消隐藏NonBlockingWorker
。 - 添加了通过
TestDriver.setInitialDelayMet(UUID)
和TestDriver.setPeriodDelayMet(UUID)
在TestDriver
中触发定时工作的功能。b/113360060
重大变更
- 废弃了默认的
Worker
和NonBlockingWorker
构造函数。请尽快迁移到新的构造函数。我们将在未来版本中移除默认构造函数。
版本 1.0.0-alpha08
2018 年 8 月 27 日
bug 修复
- 将 WorkManager 组件明确标记为无法感知直接启动,这样它们就不会在直接启动期间启动。将来,我们将提供可感知直接启动的 WorkManager 版本。b/112665532
- 修复了重试的工作未运行的问题。b/112604021
- 修复了未重复执行定期工作的问题(与上述问题相关)。b/112859683
- 当应用进程已在运行时,遵循了退避策略。
- 更正了
Data
中的异常错误消息,以指明限制为 10KB。 - 将
Configuration.setMaxSchedulerLimit(int)
的最大值减小到了 50,以补偿JobScheduler
处理过程中的一些延迟。b/112817355
版本 1.0.0-alpha07
2018 年 8 月 16 日
bug 修复
- 修复了具有负限制的潜在 SQL 查询,该查询可能会返回无限数量的结果。
- 已完成执行的工作现在可以正确取消其他调度程序中该工作的所有待处理副本。这会导致超出
JobScheduler
作业限制。b/111569265 - 修复了
ConstraintTracker
中的ConcurrentModificationException
。b/112272753 - 将
Data.getBooleanArray(String)
和Data.getIntArray(String)
的返回值类型注解更改为@Nullable
而不是@NonNull
。b/112275229
API 变更
Worker
现在扩展了一个新类NonBlockingWorker
。这不会影响任何当前的用法。将来,NonBlockingWorker
将成为自定义线程解决方案完全支持的实体。- 将
Data.getBooleanArray(String)
和Data.getIntArray(String)
的返回值类型注解更改为@Nullable
而不是@NonNull
。b/112275229 - Kotlin 扩展程序:弃用了
Map.toWorkData()
而添加了顶级workDataOf(vararg Pair<String, Any?>)
,以便与现有 API 更加一致。
版本 1.0.0-alpha06
2018 年 8 月 1 日
bug 修复
- 防止在安排工作时锁定数据库。b/111801342
- 修复了导致
PeriodicWork
在低电耗模式下无法按计划运行的错误。b/111469837 - 修复了跟踪约束时导致
WorkManager
崩溃的竞争条件问题。googlecodelabs/android-workmanager/issues/56 - 在使用
WorkRequest.Builder#build()
时创建唯一的WorkRequest
。b/111408337 - 仅当有
WorkRequest
需要时,才启用RescheduleReceiver
。b/111765853
版本 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 更改。
bug 修复
- 在已知的自动备份情况下,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 日
bug 修复
- 当使用基于
AlarmManager
的实现时,现在可以正确地重新调度PeriodicWorkRequest
。 - 修复了在强行停止或重新启动后重新调度所有 Worker 时出现的潜在 ANR 问题。b/110507716
- 向各种 WorkManager API 添加了可为 null 性注解。b/110344065
- 记录在 Worker 线程执行期间发生的未捕获异常。b/109900862
- 在您决定回滚到较低版本的 WorkManager 时,允许进行破坏性数据库迁移。b/74633270
- 修复了在创建重复隐式标记时出现的迁移崩溃问题。这是一个很少见的问题,只有在您自己使用相同的隐式标记格式时才会发生。
版本 1.0.0-alpha03
2018 年 6 月 19 日
bug 修复
修复了基于
AlarmManager
的实现中的竞争条件问题。b/80346526修复了在设备重新启动后使用
JobScheduler
时出现的重复作业问题。具有内容 URI 触发器的作业现在可以在系统重新启动后保留。b/80234744
文档更新。b/109827628、b/109758949 和 b/80230748
修复了在将
WorkRequest
重新加入队列时出现的崩溃问题。b/109572353修复了在使用
work-runtime-ktx
依赖项时出现的 Kotlin 编译器警告。WorkManager 现在使用
Room
1.1.1-rc1
。
API 变更
- 添加了
getStatusesSync()
,即WorkContinuation.getStatuses()
的同步版本。 Worker
能够区分用户发起的取消和操作系统请求的临时停止。如果已请求任何类型的停止,Worker.isStopped()
将返回true
。显式取消工作进程后,Worker.isCancelled()
将返回true
。b/79632247- 在 API 28 上添加了对 JobParameters#getNetwork() 的支持。这通过
Worker.getNetwork()
公开。 - 添加了
Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit)
,这样便可强制规定可以将多少作业发送到JobScheduler
或AlarmManager
。这有助于防止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/79950952 和 b/109710758
行为变更
- 为所有
WorkRequest
添加了一个隐式标记,它是Worker
的完全限定类名。这样便能够在没有tag
的情况下或在id
不可用时移除WorkRequest
。b/109572351
重大变更
- 已将
Worker.WorkerResult
重命名为Worker.Result
。 Worker.onStopped
现在有一个额外的isCancelled
参数,显式取消Worker
后,该参数将设置为true
。
版本 1.0.0-alpha02
2018 年 5 月 24 日
bug 修复
- 修复了在
State.isFinished()
时出现的NullPointerException
。b/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
软件包移到了androidx.work
软件包。废弃了旧的扩展,将在以后的版本中将其移除。 - 废弃了
Configuration.withExecutor()
。请改用Configuration.setExecutor()
。
版本 1.0.0-alpha01
2018 年 5 月 8 日
WorkManager 可以简化有保证的约束感知型后台工作的调度和执行。此初始版本为 1.0.0-alpha01
。