Google is committed to advancing racial equity for Black communities. See how.

WorkManager

Note: WorkManager requires compileSdk version 28 or higher. The WorkManager API makes it easy to schedule deferrable, asynchronous tasks that must be run reliably . These APIs let you create a task and hand it off to WorkManager to run when the work constraints are met.

Latest Update Current Stable Release Next Release Candidate Beta Release Alpha Release September 16, 2020 2.4.0 - - 2.5.0-alpha02

Declaring dependencies

To add a dependency on WorkManager, you must add the Google Maven repository to your project:

Add the dependencies for the artifacts you need in the build.gradle file for your app or module:

dependencies { def work_version = "2.4.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" }

For information on using Kotlin extensions, see the ktx documentation.

For more information about dependencies, see Add Build Dependencies.

Feedback

Your feedback helps make Jetpack better. Let us know if you discover new issues or have ideas for improving this library. Please take a look at the existing issues in this library before you create a new one. You can add your vote to an existing issue by clicking the star button.

Create a new issue

See the Issue Tracker documentation for more information.

Version 2.5.0

Version 2.5.0-alpha02

September 16, 2020

androidx.work:work-*:2.5.0-alpha02 is released. Version 2.5.0-alpha02 contains these commits.

New Features

Add an API to WorkQuery to be able to use id s to query WorkInfo s. (aosp/1412372, b/157335295)

s to query s. (aosp/1412372, b/157335295) WorkManager better supports apps that use multiple processes with a new artifact ( androidx.work:work-multiprocess:* ). This new artifact helps solve a few problems that large apps encounter including: WorkManager typically needs to be initialized in every app process. This is not great because there is increased SQLite contention which in turn causes other problems. WorkManager now has new APIs which can be used to designate a primary app process using Configuration#setDefaultProcessName(processName) . The processName is a fully qualified process name which looks like packageName:processName (e.g. com.example:remote ). A set of new APIs: RemoteWorkManager and RemoteWorkContinuation to enqueue , cancel and query work requests. These APIs do not include LiveData variants to avoid SQLite contention across multiple-processes. All calls to enqueue , cancel and query are forwarded to a primary app process using AIDL and return a fluent ListenableFuture . (aosp/1392657, aosp/1411210, aosp/1412215, aosp/1417713)

). This new artifact helps solve a few problems that large apps encounter including:

API Changes

WorkManager now prunes completed WorkRequest s that have no incomplete dependencies more aggressively. The buffer duration changed from 7 days to 1 day. (aosp/1419708)

Bug Fixes

WorkManager now reconciles jobs proactively so WorkRequest s and JobScheduler jobs are in sync when WorkManager is initialized. (aosp/1412794, b/166292069)

Version 2.5.0-alpha01

August 19, 2020

androidx.work:work-*:2.5.0-alpha01 is released. Version 2.5.0-alpha01 contains these commits.

New Features

Changes to internal APIs that allow us to provide better tooling with WorkManager going forward. Stay tuned for additional updates.

Bug Fixes

Handle SecurityException s when tracking network state on some devices. (aosp/1396969)

External Contribution

Fix documentation for ArrayCreatingInputMerger by Zac Sweers (github/43).

Version 2.4.0

Version 2.4.0

July 22, 2020

androidx.work:work-*:2.4.0 is released. Version 2.4.0 contains these commits.

Major changes since 2.3.0

WorkManager s in-process scheduler is now more capable. Previously, the in-process Scheduler would only consider executing work that was not delayed and whose constraints were met. Now, the in-process scheduler tracks WorkRequest s which might be executed in the future, including PeriodicWorkRequests. The in-process Scheduler also does not observe scheduling limits (but is still restricted to the size of the Executor being used by WorkManager). This means that the application can now execute a lot more WorkRequests when the app is in the foreground. To manage execution of delayed work in the foreground, WorkManager also introduces a new configurable RunnableScheduler . (aosp/1185778)

s in-process scheduler is now more capable. Previously, the in-process would only consider executing work that was not delayed and whose constraints were met. Now, the in-process scheduler tracks s which might be executed in the future, including PeriodicWorkRequests. The in-process also does not observe scheduling limits (but is still restricted to the size of the being used by WorkManager). This means that the application can now execute a lot more WorkRequests when the app is in the foreground. To manage execution of delayed work in the foreground, also introduces a new configurable . (aosp/1185778) WorkManager now supports RxJava 3. To use RxJava 3, you should include the following dependency: implementation "androidx.work:work-rxjava3:2.4.0" . (aosp/1277904)

. (aosp/1277904) Added the ability to query for WorkInfo s by using a WorkQuery . This is useful when developers want to query WorkInfo s by a combination of multiple attributes. For more information look at WorkQuery.Builder.fromStates(...) , WorkQuery.Builder. fromTags(...) or WorkQuery.Builder.fromUniqueWorkNames(...) . (aosp/1253230, b/143847546)

s by using a . This is useful when developers want to query s by a combination of multiple attributes. For more information look at , or . (aosp/1253230, b/143847546) Add the ability to request diagnostic information from WorkManager using: adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>" This provides a lot of useful information including: WorkRequests that were completed in the last 24 hours. WorkRequests that are currently RUNNING. Scheduled WorkRequests. (aosp/1235501)

Add ExistingWorkPolicy.APPEND_OR_REPLACE which is similar to APPEND , but replaces a chain that has cancelled or failed prerequisites. (b/134613984, aosp/1199640)

Provide the ability to add a custom RunnableScheduler to track WorkRequests that need to be executed in the future. This is used by the in-process Scheduler. (aosp/1203944)

Add support for dynamically adding factories to delegate to, when using a DelegatingWorkerFactory . (b/156289105, aosp/1309745)

Align tracking for BATTERY_NOT_LOW constraints more closely with the platform. (aosp/1312583)

The in-process scheduler now uses better APIs to determine the name of the process. This is useful to better support apps that use multiple-processes. (aosp/1324732)

New Lint rules which enforce: Use of the right foregroundServiceType when using setForegroundAsync() APIs. (b/147873061, aosp/1215915) Specifying JobScheduler ids that WorkManager should use when using JobService APIs directly. aosp/1223567 Added a new lint rule that ensures that ListenableWorker implementations are now public when using the default WorkerFactory . (aosp/1291262)

Calls to setForegroundAsync() that do not complete before completion of a ListenableWorker will now be signalled via an IllegalStateException on the returned ListenableFuture . (aosp/1262743)

Fix a bug where the ForegroundService is not stopped after a foreground Worker is interrupted. (b/155579898, aosp/1302153)

Fix a bug where WorkManager attempts to execute multiple instances of a Worker bound to a Foreground Service (b/156310133, aosp/1309853)

Version 2.4.0-rc01

June 24, 2020

androidx.work:work-*:2.4.0-rc01 is released. Version 2.4.0-rc01 contains these commits.

Bug Fixes

The in-process scheduler now uses better APIs to determine the name of the process. This is useful to better support apps that use multiple-processes. (aosp/1324732)

Version 2.4.0-beta01

May 20, 2020

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 , and androidx.work:work-testing:2.4.0-beta01 are released. Version 2.4.0-beta01 contains these commits.

Bug Fixes

Fix a bug where the ForegroundService is not stopped after a foreground Worker is interrupted. (b/155579898, aosp/1302153)

is not stopped after a foreground is interrupted. (b/155579898, aosp/1302153) Fix a bug where WorkManager attempts to execute multiple instances of a Worker bound to a Foreground Service (b/156310133, aosp/1309853)

attempts to execute multiple instances of a bound to a Foreground Service (b/156310133, aosp/1309853) Add support for dynamically adding factories to delegate to, when using a DelegatingWorkerFactory . (b/156289105, aosp/1309745)

. (b/156289105, aosp/1309745) Align tracking for BATTERY_NOT_LOW constraints more closely with the platform. (aosp/1312583)

Version 2.4.0-alpha03

April 29, 2020

androidx.work:work-*:2.4.0-alpha03 is released. Version 2.4.0-alpha03 contains these commits.

New Features

WorkManager now supports RxJava 3. To use RxJava 3, you should include the following dependency: implementation "androidx.work:work-rxjava3:2.4.0-alpha03" . (aosp/1277904)

. (aosp/1277904) Added a new lint rule that ensures that ListenableWorker implementations are now public when using the default WorkerFactory . (aosp/1291262)

API Changes

Calling setProgressAsync() after a ListenableWorker has finished execution will now signal an Exception via the ListenableFuture . (aosp/1285494)

after a has finished execution will now signal an via the . (aosp/1285494) WorkQuery.Builder is now marked final . (aosp/1275037)

is now marked . (aosp/1275037) WorkQuery.Builder factory methods withStates , withTags and withUniqueWorkNames have been renamed to fromStates , fromTags and fromUniqueWorkNames respectively. (aosp/1280287)

Bug Fixes

Ignore SecurityException s when tracking network state of a device. (b/153246136, aosp/1280813)

Version 2.4.0-alpha02

April 1, 2020

androidx.work:work-*:2.4.0-alpha02 is released. Version 2.4.0-alpha02 contains these commits.

New Features

Added a new Lint rule that warns when WorkRequest s requires both Constraints.setRequiresCharging(...) and Constraints.setRequiresDeviceIdle(...) . Some devices are never charging and idle at the same time. So such requests would run less frequently than expected. (aosp/1253840)

API Changes

Added the ability to query for WorkInfo s by using a WorkQuery . This is useful when developers want to query WorkInfo s by a combination of multiple attributes. For more information look at WorkQuery.Builder withStates(...) , WorkQuery.Builder withTags(...) or WorkQuery.Builder withUniqueWorkNames(...) . (aosp/1253230, b/143847546)

Calls to setForegroundAsync() that do not complete before completion of a ListenableWorker will now be signalled via an IllegalStateException on the returned ListenableFuture . (aosp/1262743)

Bug Fixes

Fixed the lint rule that checks for invalid interval durations for PeriodicWorkRequest s. (aosp/1254846, b/152606442)

Version 2.4.0-alpha01

March 4, 2020

androidx.work:work-*:2.4.0-alpha01 is released. Version 2.4.0-alpha01 contains these commits.

New Features

WorkManager s in-process scheduler is now more capable. Previously, the in-process Scheduler would only consider executing work that was not delayed and whose constraints were met. Now, the in-process scheduler tracks WorkRequest s which might be executed in the future, including PeriodicWorkRequest s. The in-process Scheduler also does not observe scheduling limits (but is still restricted to the size of the Executor being used by WorkManager). This means that the application can now execute a lot more WorkRequest s when the app is in the foreground. (aosp/1185778)

Added the ability to request diagnostic information from WorkManager using adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>" . This provides a lot of useful information including: WorkRequests that were completed in the last 24 hours. WorkRequests that are currently RUNNING. Scheduled WorkRequests. (aosp/1235501)

New Lint rules which enforce: Use of the right foregroundServiceType when using setForegroundAsync() APIs. (b/147873061, aosp/1215915) Specifying JobScheduler ids that WorkManager should use when using JobService APIs directly. (aosp/1223567)



API Changes

Add ExistingWorkPolicy.APPEND_OR_REPLACE which is similar to APPEND , but replaces a chain that has cancelled or failed prerequisites. (b/134613984, aosp/1199640)

Provide the ability to add a custom RunnableScheduler to track WorkRequest s that need to be executed in the future. This is used by the in-process Scheduler. (aosp/1203944)

Bug Fixes

Deprecated setProgress() in RxWorker because it previously returned a Single<Void> which is an impossible type. Added a new API setCompletableProgress() which returns a Completable instead; and added new Lint rules which help migrate to the new APIs. (b/150080946, aosp/1242665)

Version 2.3.4

Version 2.3.4

March 18, 2020

androidx.work:work-*:2.3.4 is released. Version 2.3.4 contains these commits.

Bug Fixes

Fixed a bug which would cause multiple instances of a long running Worker s to run, after exceeding the 10 minute execution window. (aosp/1247484, b/150553353)

s to run, after exceeding the 10 minute execution window. (aosp/1247484, b/150553353) Fix for WorkManager’s lint IssueRegistry . Thank you @ZacSweers from Slack, for the contribution. (aosp/1217923)

Version 2.3.3

Version 2.3.3

March 4, 2020

androidx.work:work-*:2.3.3 is released. Version 2.3.3 contains these commits.

Bug Fixes

Fixed a bug where if a Worker was interrupted, it would not get rescheduled correctly. (b/150325687, aosp/1246571)

Version 2.3.2

Version 2.3.2

February 19, 2020

androidx.work:work-*:2.3.2 are released. Version 2.3.2 contains these commits.

Bug Fixes

Fixes an issue where WorkManager exceeds the 100 job limit in JobScheduler in rare cases. (aosp/1226859, b/149092520)

Fix for a race condition in ConstraintControllers. (aosp/1220100)

Improved the management foreground Service lifecycle for long running Workers. (aosp/1226295)

Improved the management of cancellation of Notifications for long running Workers upon Worker cancellation. (aosp/1228346)

Version 2.3.1

Version 2.3.1

February 5, 2020

androidx.work:work-*:2.3.1 is released. Version 2.3.1 contains these commits.

Bug fixes

Better manage the lifecycle of Notification s for long running Worker s that run when a foreground Service is active. (aosp/1218539, b/147249312)

s for long running s that run when a foreground is active. (aosp/1218539, b/147249312) WorkManager now depends on androidx.sqlite:sqlite-framework:2.1.0 stable. (aosp/1217729)

now depends on stable. (aosp/1217729) Added lint rules to ensure that a foregroundServiceType is specified in the AndroidManifest.xml when using foregroundServiceType s in ForegroundInfo . (aosp/1214207, b/147873061)

Version 2.3.0

Version 2.3.0

January 22, 2020

androidx.work:work-*:2.3.0 is released with no changes since 2.3.0-rc01 . Version 2.3.0 contains these commits.

Important changes since 2.2.0

Support for long running or important work via ListenableWorker#setForegroundAsync() .

. Support for Worker Progress via ListenableWorker#setProgressAsync() .

. WorkManager now packages additional lint rules as part of the library which helps catch bugs early.

Version 2.3.0-rc01

January 8, 2020

androidx.work:work-*:2.3.0-rc01 is released. Version 2.3.0-rc01 contains these commits.

This release is identical to 2.3.0-beta02

Bug fixes

The work-testing artifact now defines an api dependency on work-runtime-ktx . (aosp/1194410)

Version 2.3.0-beta02

December 18, 2019

androidx.work:work-*:2.3.0-beta02 is released. Version 2.3.0-beta02 contains these commits.

New features

Added a better error message for non-recoverable SQLite exceptions. (aosp/1185777)

Added a lint rule which ensures that the content provider androidx.work.impl.WorkManagerInitializer is removed from the AndroidManifest.xml when using on demand initialization. (aosp/1167007)

is removed from the when using on demand initialization. (aosp/1167007) Added a lint warning when enqueue() is used for a PeriodicWorkRequest instead of enqueueUniquePeriodicWork() . (aosp/1166032)

API changes

ForegroundInfo now requires you to specify the notificationId to be used when using ListenableWorker.setForegroundAsync() . This is a breaking change. This allows you to run multiple long running Worker s in parallel. WorkManager also better manages lifetimes of the provided Notification s. (b/145473554, aosp/1181208, asop/1181216, asop/1183577)

Bug fixes

Fixed a bug in the AlarmManager implementation where alarms were not being cleaned up correctly. (aosp/1156444)

Fixed a bug where an empty list of WorkRequest s would cause an incorrect WorkContinuation chain to be built. (b/142835274, aosp/1157051)

Dependency changes

WorkManager now uses Room 2.2.2.

Version 2.3.0-beta01

November 20, 2019

androidx.work:work-*:2.3.0-beta01 is released. Version 2.3.0-beta01 contains these commits.

New features

Added a new lint rule which prevents developer errors due to incorrect implementation of androidx.work.Configuration.Provider when using on-demand initialization. aosp/1164559

Version 2.3.0-alpha03

October 23, 2019

androidx.work:work-*:2.3.0-alpha03 is released. Version 2.3.0-alpha03 contains these commits.

New features

Added WorkManager.createCancelPendingIntent() API which makes it easy to cancel WorkRequest s without having to register another component in the AndroidManifest.xml . This API makes it especially easy to cancel WorkRequest s from Notification s. We expect this to be paired with the new foreground APIs in 2.3.0.

API which makes it easy to cancel s without having to register another component in the . This API makes it especially easy to cancel s from s. We expect this to be paired with the new foreground APIs in 2.3.0. WorkManager now depends on androidx.room:*:2.2.0 stable.

API changes

Renamed ForegroundInfo.getNotificationType() to ForegroundInfo.getForegroundServiceType() to be more consistent with the underlying platform APIs. (b/142729893, aosp/1143316)

Bug fixes

Fixed a bug which is caused by an unnecessary call to setTransactionSuccessful() outside of a transaction. This happens for rare migrations. (b/142580433, aosp/1141737)

Version 2.3.0-alpha02

October 9, 2019

androidx.work:work-*:2.3.0-alpha02 is released. Version 2.3.0-alpha02 contains these commits.

New features

WorkManager now supports running long running or important work that should be kept alive by the OS. For more information look at ListenableWorker#setForegroundAsync() (or CoroutineWorker#setForeground() for Kotlin). (aosp/1133636)

API changes

The containsKey API in Data is renamed to hasKeyWithValueOfType . The corresponding extension method in the ktx library has also been renamed. (b/141916545)

Bug fixes

WorkManager schedules work fairly when the number of WorkRequest s enqueued approach scheduling limits. (aosp/1105766)

s enqueued approach scheduling limits. (aosp/1105766) WorkManager calls ListenableWorker#onStopped() only if the work is not already completed. (b/140055777)

only if the work is not already completed. (b/140055777) WorkManager now removes progress information when a worker gets interrupted or reaches its terminal state. (aosp/1114572)

Data now has a much more useful toString() representation. (b/140945323)

now has a much more useful representation. (b/140945323) Data now has a better equals() method. It also supports deepEquals for Array types. (b/140922528)

now has a better method. It also supports for types. (b/140922528) WorkManager now stores its internal database and preference files in a no backup directory. (b/114808216)

Version 2.3.0-alpha01

August 22, 2019

androidx.work:work-*:2.3.September 5, 20190-alpha01 is released. The commits included in this version can be found here.

New features

ListenableWorker s can now set progress via the setProgressAsync() API. Also added a corresponding suspend -ing setProgress API in CoroutineWorker and a setProgress in RxWorker which returns a Single<Void> . With these new APIs Workers can convey progress information via WorkInfo which has a corresponding getProgress API. (b/79481554)

s can now set progress via the API. Also added a corresponding -ing API in and a in which returns a . With these new APIs Workers can convey progress information via which has a corresponding API. (b/79481554) Data has a containsKey() API which can be used to validate that input data to Worker s has keys with the expected type. (b/117136838)

has a API which can be used to validate that input data to s has keys with the expected type. (b/117136838) Data can now be serialized using Data.toByteArray() and Data.fromByteArray() . Note that there are no versioning guarantees with Data so you should not persist it or use it for IPC between applications. They are only safe to be used between multiple processes of the same application.

can now be serialized using and . Note that there are no versioning guarantees with so you should not persist it or use it for IPC between applications. They are only safe to be used between multiple processes of the same application. Added the ability to specify an InputMergerFactory via Configuration.setInputMergerFactory . (b/133273159)

API changes

WorkManager will throw an instance of IllegalStateException if a WorkerFactory returns an instance of ListenableWorker which has been previously invoked. (b/139554406)

if a returns an instance of which has been previously invoked. (b/139554406) Documentation updates around ListenableFuture cancellation and the onStopped() callback in ListenableWorker . (b/138413671)

Bug fixes

The in-process Scheduler now ignores WorkRequest s with the idle constraint. These requests are now only picked up by JobScheduler when the device is actually idle . (aosp/1089779)

s with the constraint. These requests are now only picked up by when the device is actually . (aosp/1089779) TestScheduler now correctly uses the specified Executor for its internal task executor in tests. (aosp/1090749)

Version 2.2.0

Version 2.2.0

August 15, 2019

androidx.work:work-*:2.2.0 is released. The commits included in this version can be found here.

This release is identical to androidx.work:work-*:2.2.0-rc01 .

Important Changes in 2.2.0 from 2.1.0

androidx.work:work-gcm:2.2.0 is a new Maven artifact which supports the use of GCMNetworkManager as a scheduler when Google Play Services is available for API levels <= 22. This is an optional dependency that helps with more reliable and performant background processing on older API versions. If your app uses Google Play Services, add this dependency to your gradle file to automatically get GCMNetworkManager support. If Play Services is not available, WorkManager will continue to fall back to AlarmManager on older devices.

Version 2.2.0-rc01

July 30, 2019

androidx.work:work-*:2.2.0-rc01 is released. The commits included in this version can be found here.

Bug fixes

Fixed a bug in the AlarmManager implementation that causes the Service to shutdown prematurely and resulting in a RejectedExecutionException in rare cases. (aosp/1092374) (b/138238197).

in rare cases. (aosp/1092374) (b/138238197). Added a workaround for a NullPointerException when using JobScheduler APIs on some devices. (aosp/1091020) (b/138364061), (b/138441699)

Version 2.2.0-beta02

July 19, 2019

androidx.work:work-*:2.2.0-beta02 is released. The commits included in this version can be found here.

Bug fixes

Removed unintentional jacoco dependency that was introduced in 2.2.0-beta01 .

Version 2.2.0-beta01

July 17, 2019

androidx.work:work-*:2.2.0-beta01 is released. The commits included in this version can be found here.

Caution: This version contains an unintentional dependency on org.jacoco:org.jacoco.agent:0.8.3 , which can cause a build failure. Please update to the latest version, in which this dependency has been removed.

New features

androidx.work:work-gcm:2.2.0-beta01 is a new Maven artifact which supports the use of GCMNetworkManager as a scheduler when Google Play Services is available for API levels <= 22. This is an optional dependency that helps with more reliable and performant background processing on older API versions. If your app uses Google Play Services, add this dependency to your gradle file to automatically get GCMNetworkManager support. If Play Services is not available, WorkManager will continue to fall back to AlarmManager on older devices.

Bug fixes

Fix for IllegalArgumentException when tracking network state on Nvidia Shield K1 tablets. (aosp/1010188)

Version 2.1.0

Version 2.1.0

July 11, 2019

androidx.work:work-*:2.1.0 is released. This release is identical to androidx.work:work-*:2.1.0-rc01 .

Important changes since 2.0.1

work-runtime-ktx now requires Java 8. If you run into any issues, you can add the following to your build.gradle : kotlinOptions { jvmTarget = "1.8" }

now requires Java 8. If you run into any issues, you can add the following to your : Added on-demand initialization for WorkManager, which will create WorkManager only when referenced. b/127497100 To set up your project for on-demand initialization: Disable the automatic initializer. Implement Configuration.Provider on your custom Application object. Change all references of WorkManager.getInstance() to WorkManager.getInstance(Context) . As part of this change, we have deprecated WorkManager.getInstance() . It is always safer to call the new WorkManager.getInstance(Context) replacement, even if you're not doing on-demand initialization.

PeriodicWorkRequest s now support initial delays. You can use the setInitialDelay method on PeriodicWorkRequest.Builder to set an initial delay. b/111404867

s now support initial delays. You can use the method on to set an initial delay. b/111404867 Added the ability to delegate to one or more registered WorkerFactory s using DelegatingWorkerFactory . b/131435993

s using . b/131435993 Added the ability to customize the Executor used by WorkManager for all its internal book-keeping via Configuration.Builder.setTaskExecutor .

used by WorkManager for all its internal book-keeping via . Added the ability to create unit testable Worker and ListenableWorker classes by using TestWorkerBuilder and TestListenableWorkerBuilder in the work-testing artifact. Note that work-testing now pulls in Kotlin as a dependency and includes several Kotlin extensions by default.

and classes by using and in the artifact. Added run attempt count to WorkInfo . b/127290461

. b/127290461 Data types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of Data objects.

types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of objects. WorkManager now depends on Room 2.1.0 , which should fix some database issues.

Version 2.1.0-rc01

June 27, 2019

androidx.work:work-*:2.1.0-rc01 is released. The commits included in this version can be found here.

Bug fixes

Fixed a bug which would cause an application to crash when executing jobs with JobScheduler while a backup was in progress b/135858602.

Version 2.1.0-beta02

June 20, 2019

androidx.work:work-*:2.1.0-beta02 is released. The commits included in this version can be found here.

Note: This version is dependent on the Java 8 programming language. Please read Use Java 8 language features to learn how to use it in your project.

Bug fixes

TestListenableWorkerBuilder now uses the correct WorkerFactory when creating instances of ListenableWorker . b/135275844

now uses the correct when creating instances of . b/135275844 Fixed a bug which caused drifts in the execution windows for WorkRequest s due to process death. b/135272196

Version 2.1.0-beta01

June 13, 2019

androidx.work:work-*:2.1.0-beta01 is released. The commits included in this version can be found here.

Note: This version is dependent on the Java 8 programming language. Please read Use Java 8 language features to learn how to use it in your project.

Bug fixes

WorkManager now depends on Room 2.1.0 , which should fix some database issues.

, which should fix some database issues. Removed some startup disk I/O on the main thread.

Fixed a potential deadlock in constraint tracking. b/134361006

Preemptively cancelled invalid jobs attributed to WorkManager. b/134058261

Added some defensive calls to JobScheduler APIs for misbehaving devices.

Version 2.1.0-alpha03

June 5, 2019

androidx.work:*:2.1.0-alpha03 is released.

Bug fixes

Improved documentation for PeriodicWorkRequest s.

s. WorkManagerTestInitHelper now uses the correct background executor for tests.

now uses the correct background executor for tests. Fixes for SQLite issues when dealing with large transactions on some devices. (b/130182503)

WorkManager’s dependencies are now more granular. (b/133169148).

Workaround OEM specific bugs in the implementation of JobScheduler when scheduling jobs using WorkManager.

when scheduling jobs using WorkManager. Improvements in the AlarmManager based scheduler around service lifetimes that previously caused rare crashes. (b/133313734)

Version 2.1.0-alpha02

May 16, 2019

WorkManager 2.1.0-alpha02 is released. This version contains several new APIs.

API Changes

PeriodicWorkRequest s now support initial delays. You can use the setInitialDelay method on PeriodicWorkRequest.Builder to set an initial delay. b/111404867

Added the ability to delegate to one or more registered WorkerFactory s using DelegatingWorkerFactory . b/131435993

Added the ability to customize the Executor used by WorkManager for all its internal book-keeping via Configuration.Builder.setTaskExecutor .

Improved documentation around WorkRequest.keepResultsForAtLeast (b/130638001), on-demand initialization, and PeriodicWorkRequest.Builder (b/131711394).

Version 2.1.0-alpha01

April 24, 2019

WorkManager 2.1.0-alpha01 is released. This version contains several new APIs. Please note that starting with this version, there will be new features that won't get backported to the 1.x release. We recommend switching to 2.x.

API Changes

Added on-demand initialization for WorkManager, which will create WorkManager only when referenced. b/127497100 To set up your project for on-demand initialization: Disable the automatic initializer. Implement Configuration.Provider on your custom Application object. Change all references of WorkManager.getInstance() to WorkManager.getInstance(Context) . As part of this change, we have deprecated WorkManager.getInstance() . It is always safer to call the new WorkManager.getInstance(Context) replacement, even if you're not doing on-demand initialization.

Added the ability to create unit testable Worker and ListenableWorker classes by using TestWorkerBuilder and TestListenableWorkerBuilder in the work-testing artifact. Note that work-testing now pulls in Kotlin as a dependency, but also includes several Kotlin extensions by default.

and classes by using and in the artifact. Added run attempt count to WorkInfo . b/127290461

. b/127290461 Data types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of Data objects.

types can now store and retrieve bytes and byte arrays. This does NOT change the maximum size of objects. Deprecated CoroutineWorker.coroutineContext . This field was incorrectly typed as a CoroutineDispatcher ; you should no longer need it as you can go to the desired coroutineContext yourself in the body of the suspending function.

. This field was incorrectly typed as a ; you should no longer need it as you can go to the desired coroutineContext yourself in the body of the suspending function. RxWorker.createWork() and RxWorker.getBackgroundScheduler() are now annotated with @NonNull return types.

Version 2.0.1

Version 2.0.1

April 9, 2019

WorkManager 2.0.1 is released. This release is identical to 2.0.1-rc01.

Version 2.0.1-rc01

April 3, 2019

WorkManager 2.0.1-rc01 is released. This version contains some bug fixes. For legacy 1.x users, some of these changes also appear in 1.0.1-rc01.

Bug Fixes

Robolectric tests now operate properly with WorkManager. b/122553577

Fixed an edge case crash with constraints tracking not being cleaned up on pre-JobScheduler APIs. b/129226383

Fixed a StackOverflowError dealing with long chains of work. b/129091233

dealing with long chains of work. b/129091233 Updated documentation for PeriodicWorkRequest s to indicate that flex time is not supported on API 23.

s to indicate that flex time is not supported on API 23. Fixed some broken links in the Kotlin documentation.

Version 2.0.0

Version 2.0.0

March 20, 2019

WorkManager 2.0.0 is released. This version is identical to 2.0.0-rc01 and is the AndroidX version of 1.0.0 stable with AndroidX dependencies. We recommend targeting this version instead of the legacy 1.x versions. All active development will target 2.x and 1.x will only receive critical bug fixes for a limited time.

Version 2.0.0-rc01

March 7, 2019

WorkManager 2.0.0-rc01 is released. This version is identical to 1.0.0 stable but has AndroidX dependencies. Once this reaches 2.0.0 stable, you should include this version and the legacy 1.x versions will only receive some critical bug fixes. All active development will target 2.x.

Pre-AndroidX Dependencies



Reference docs: 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" } For information on using Kotlin extensions, see the ktx documentation Reference docs: Java

Note: WorkManager classes are already in the androidx.work package, but currently depend on non-AndroidX dependencies including the Support Library 27.1 and associated Arch component versions. A version of WorkManager with AndroidX dependencies will be released in the future.

Version 1.0.1

Version 1.0.1

April 9, 2019

WorkManager 1.0.1 is released. This release is identical to 1.0.1-rc01.

Please note that we strongly encourage users to update to WorkManager 2.x, as there will be very few updates to the 1.x branch moving forward. New APIs will also not be released for the 1.x library.

Version 1.0.1-rc01

April 2, 2019

WorkManager 1.0.1-rc01 is released. This version contains some bug fixes.

Bug Fixes

Robolectric tests now operate properly with WorkManager. b/122553577

Fixed an edge case crash with constraints tracking not being cleaned up on pre-JobScheduler APIs. b/129226383

Fixed a StackOverflowError dealing with long chains of work. b/129091233

Version 1.0.0

Version 1.0.0

March 05, 2019

This is WorkManager's 1.0.0 stable release. This version of WorkManager is identical to 1.0.0-rc02.

Version 1.0.0-rc02

February 21, 2019

This is the second release candidate for WorkManager's 1.0.0 stable release. This release contains two bug fixes.

Bug Fixes

Worker s are now correctly scheduled after an application crash. b/124546316

Worker s that throw an unchecked Exception are now correctly marked as FAILED and no longer crash the app process.

Version 1.0.0-rc01

February 14, 2019

This is a release candidate for WorkManager's 1.0.0 stable release. This release contains one bug fix.

Bug Fixes

The AlarmManager based implementation now correctly respects flex windows for PeriodicWorkRequests. b/124274584

Version 1.0.0-beta05

February 6, 2019

This release contains some bug fixes.

Bug Fixes

Fixed a case where JobScheduler.getPendingJob(...) was used on API 23. b/123893059

was used on API 23. b/123893059 Fixed a NullPointerException on devices running Android 5.1 (API level 22) or lower. b/123835104

Version 1.0.0-beta04

February 4, 2019

This release contains some bug fixes.

Bug Fixes

Improved scheduling of PeriodicWork for the AlarmManager based implementation.

Fixed a case where WorkManager failed to correctly track constraints when using the AlarmManager based implementation. b/123379508

Fixed a case when WorkManager failed to retry work on process death when using the AlarmManager based implementation. b/123329850

Fixed a case which would cause WorkManager to leak Wakelocks when using the AlarmManager based implementation.

Version 1.0.0-beta03

January 25, 2019

This release contains some bug fixes.

Bug Fixes

We introduced a regression 1.0.0-beta02 that was causing work to not execute properly in some situations. b/123211993

that was causing work to not execute properly in some situations. b/123211993 Fixed a case where work wasn't properly honoring backoff timing. b/122881597

Fixed a ConcurrentModificationException on devices running Android 5.1 (API or) or lower. This is a continuation of the fix in 1.0.0-beta02 . b/121345393

on devices running Android 5.1 (API or) or lower. This is a continuation of the fix in . b/121345393 Added exported=false for some components in our manifest that were missing this annotation.

for some components in our manifest that were missing this annotation. Included information about how WorkManager interacts with the OS in the package-level documentation.

Version 1.0.0-beta02

January 15, 2019

This release contains some bug fixes.

Bug Fixes

Fixed an edge case where periodic work could run more than once per interval on devices running Android 6.0 (API level 23). b/121998363

Fixed a ConcurrentModificationException on devices running Android 5.1 (API level 22) or lower. b/121345393

on devices running Android 5.1 (API level 22) or lower. b/121345393 Fixed erroneous execution of work when Constraints aren't met on devices running Android 5.1 (API level 22) or lower. b/122578012

Optimized work completion handling to be faster in some edge cases. b/122358129

Added a change to address potential race conditions among multiple instances of LiveData that WorkManager uses.

that WorkManager uses. Moved to use Room dependency 1.1.1 instead of 1.1.1-rc01 ; these versions are identical. b/122578011

Version 1.0.0-beta01

December 19, 2018

This release contains no API changes; moving forward, WorkManager is expected to stay API stable until the next version unless there is a critical problem. This release contains some bug fixes.

Bug Fixes

Previously-cancelled children of successfully completed parent work will no longer run. b/120811767

Properly initialized logging classes (primarily surfaced during tests).

Version 1.0.0-alpha13

December 12, 2018

This release contains a minor API change that will be helpful for some Kotlin users.

API Changes

androidx.work.Result has been moved to be an inner class of ListenableWorker . This prevents refactoring conflicts with Kotlin's top-level Result class. This is a breaking API change. b/120564418

Breaking API Changes

androidx.work.Result has been moved to be an inner class of ListenableWorker .

Version 1.0.0-alpha12

December 5, 2018

This release contains some breaking API changes; please see the Breaking API Changes section below. This version is likely to be released as our first beta. alpha12 also contains extensive documentation updates.

API Changes

A new artifact, work-rxjava2 , introduces RxWorker . This is a ListenableWorker that expects a Single<Payload> .

, introduces . This is a that expects a . Support for Firebase JobDispatcher has been removed because of its impending deprecation. This means that the work-firebase artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future.

artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future. Combined Payload into Result . Result is now a "sealed class" with three concrete implementations, which you can obtain via Result.success() (or Result.success(Data) ), Result.failure() (or Result.failure(Data) ), and Result.retry() . Your ListenableFuture s now result Result instead of Payload . Worker s don't have getter and setter methods for output Data . This is a breaking change.

into . is now a "sealed class" with three concrete implementations, which you can obtain via (or ), (or ), and . Your s now result instead of . s don't have getter and setter methods for output . This is a breaking change. Added Constraints.Builder.setTriggerContentMaxDelay(long, TimeUnit) and Constraints.Builder.setTriggerContentUpdateDelay(long, TimeUnit) and variants to better support slow triggering content URIs. b/119919774

and and variants to better support slow triggering content URIs. b/119919774 Added WorkRequest.Builder.setBackoffCriteria(BackoffPolicy, Duration) variant. This method requires API 26.

variant. This method requires API 26. Added Operation.await() and ListenableFuture.await() Kotlin extension methods.

and Kotlin extension methods. Renamed Operation.getException() to Operation.getThrowable() . This is a breaking change.

to . This is a breaking change. The ContentUriTriggers class and methods referencing it are no longer available for public usage. This is a breaking change.

class and methods referencing it are no longer available for public usage. This is a breaking change. Removed the rest of the varargs methods in WorkManager , WorkContinuation , and OneTimeWorkRequest to streamline the API. To fix any build problems, you can wrap your existing varargs with Arrays.asList(...) . We still include single-argument versions of each method. This is a breaking change.

, , and to streamline the API. To fix any build problems, you can wrap your existing varargs with . We still include single-argument versions of each method. This is a breaking change. Removed WorkContinuation.combine(OneTimeWorkRequest, *) variants. They were presenting a confusing API; the existing combine methods are more understandable. This is a breaking change.

Bug Fixes

Pre-Marshmallow implementations are now more reliable in recovering from process death of an already-executing task.

LiveData that is observed via observeForever is tracked via WorkManager. This is a backport of a Room library fix. b/74477406

that is observed via is tracked via WorkManager. This is a backport of a Room library fix. b/74477406 Data.Builder.build() now throws an exception if the serialized object exceeds its maximum size. This previously would only happen on a background thread where you couldn't properly handle it.

now throws an exception if the serialized object exceeds its maximum size. This previously would only happen on a background thread where you couldn't properly handle it. Further distinguished stopped vs. cancelled work; getWorkInfoById() will return a WorkInfo with the CANCELLED State during ListenableWorker.onStopped() .

will return a with the during . Treat null Result s as failures in ListenableWorker . b/120362353

s as failures in . b/120362353 Speculative fix for Shield Tablets running API 24 that sometimes threw an IllegalArgumentException . b/119484416

Breaking API Changes

Support for Firebase JobDispatcher has been removed because of its impending deprecation. This means that the work-firebase artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future.

artifact will no longer be updated as we head into beta. We will be looking into adding an alternative in the future. Combined Payload into Result . Result is now a "sealed class" with three concrete implementations, which you can obtain via Result.success() (or Result.success(Data) ), Result.failure() (or Result.failure(Data) ), and Result.retry() . Your ListenableFuture s now result Result instead of Payload . Worker s don't have getter and setter methods for output Data .

into . is now a "sealed class" with three concrete implementations, which you can obtain via (or ), (or ), and . Your s now result instead of . s don't have getter and setter methods for output . Added Operation.await() and ListenableFuture.await() Kotlin extension methods.

and Kotlin extension methods. Renamed Operation.getException() to Operation.getThrowable() .

to . The ContentUriTriggers class and methods referencing it are no longer available for public usage.

class and methods referencing it are no longer available for public usage. Removed the rest of the varargs methods in WorkManager , WorkContinuation , and OneTimeWorkRequest to streamline the API. To fix any build problems, you can wrap your existing varargs with Arrays.asList(...) . We still include single-argument versions of each method.

, , and to streamline the API. To fix any build problems, you can wrap your existing varargs with . We still include single-argument versions of each method. Removed WorkContinuation.combine(OneTimeWorkRequest, *) variants. They were presenting a confusing API; the existing combine methods are more understandable.

Version 1.0.0-alpha11

November 8, 2018

This release contains many changes that will become stable API at beta . There are breaking API changes in this release; please see the Breaking API Changes section below.

API Changes

work-runtime-ktx introduces a new CoroutineWorker .

introduces a new . WorkStatus has been renamed to WorkInfo . All corresponding getStatus method variants have been renamed to the corresponding getWorkInfo variants. This is a breaking change.

has been renamed to . All corresponding method variants have been renamed to the corresponding variants. This is a breaking change. ListenableWorker.onStopped() no longer accepts has a boolean argument representing if the WorkRequest was cancelled. WorkManager no longer makes this distinction. This is a breaking change.

no longer accepts has a boolean argument representing if the was cancelled. no longer makes this distinction. This is a breaking change. androidx.work.test package has been renamed to androidx.work.testing package. This is a breaking change.

package has been renamed to package. This is a breaking change. Setters on Constraints are no longer a part of the public API. This is a breaking change.

are no longer a part of the public API. This is a breaking change. WorkerParameters.getTriggeredContentUris() and WorkerParameters.getTriggeredContentAuthorities() previously returned arrays. Now these methods return Collections. This is a breaking change.

and previously returned arrays. Now these methods return Collections. This is a breaking change. ListenableWorker.onStartWork() is renamed to ListenableWorker.startWork() . This is a breaking change.

is renamed to . This is a breaking change. The constructor for WorkStatus is no longer a part of the public API. This is a breaking change.

is no longer a part of the public API. This is a breaking change. Configuration.getMaxJobSchedulerID() and Configuration.getMinJobSchedulerID() are renamed to Configuration.getMinJobSchedulerId() and Configuration.getMaxJobSchedulerId() respectively. This is a breaking change.

and are renamed to and respectively. This is a breaking change. Added a lot of @NonNull annotations to the public API to improve ergonomics of the API.

annotations to the public API to improve ergonomics of the API. Add WorkManager.enqueueUniqueWork() API to enqueue unique OneTimeWorkRequest s without having to create a WorkContinuation .

API to enqueue unique s without having to create a . All variants of enqueue and cancel methods on WorkManager now return a new Operation type. This is a breaking change.

and methods on now return a new type. This is a breaking change. All variants of enqueue no longer accept varargs for WorkRequest s. This is a breaking change. Use Collections instead. You can use Arrays.asList() to modify existing code. We did this to reduce the API surface and method count.

no longer accept varargs for s. This is a breaking change. Use Collections instead. You can use to modify existing code. We did this to reduce the API surface and method count. Attempting to initialize WorkManager more than once per process will now result in an IllegalStateException . This is a breaking change.

Bug Fixes

WorkRequest.Builder s in the work-runtime-ktx artifact now use ListenableWorker s. Fixes b/117666259

s in the artifact now use s. Fixes b/117666259 Ensure the next run time for PeriodicWork is in the future. Fixes b/118204399

is in the future. Fixes b/118204399 Remove potential disk I/O when using WorkManager on app startup. Fixes b/117796731

Fix a race condition in WorkConstraintsTracker . Fixes android-workmanager/issues/56

Breaking API Changes

WorkStatus has been renamed to WorkInfo . All corresponding getStatus method variants have been renamed to the corresponding getWorkInfo variants.

has been renamed to . All corresponding method variants have been renamed to the corresponding variants. ListenableWorker.onStopped() no longer accepts has a boolean argument representing if the WorkRequest was cancelled. WorkManager no longer makes this distinction.

no longer accepts has a boolean argument representing if the was cancelled. no longer makes this distinction. androidx.work.test package has been renamed to androidx.work.testing package.

package has been renamed to package. Setters on Constraints are no longer a part of the public API.

are no longer a part of the public API. WorkerParameters.getTriggeredContentUris() and WorkerParameters.getTriggeredContentAuthorities() previously returned arrays. Now these methods return Collections.

and previously returned arrays. Now these methods return Collections. ListenableWorker.onStartWork() is renamed to ListenableWorker.startWork() .

is renamed to . The constructor for WorkStatus is no longer a part of the public API.

is no longer a part of the public API. Configuration.getMaxJobSchedulerID() and Configuration.getMinJobSchedulerID() are renamed to Configuration.getMinJobSchedulerId() and Configuration.getMaxJobSchedulerId() respectively.

and are renamed to and respectively. All variants of enqueue and cancel methods on WorkManager now return a new Operation type.

and methods on now return a new type. All variants of enqueue no longer accept varargs for WorkRequest s.

no longer accept varargs for s. Attempting to initialize WorkManager more than once per process will now result in an IllegalStateException .

Version 1.0.0-alpha10

October 11, 2018

This release supports developer-controlled asynchronous work. There are breaking API changes in this release; please see the Breaking API Changes section below.

We anticipate that WorkManager is entering the final phases of its alpha period. We expect to be API stable in beta, so please take some time to file your feedback on our issue tracker.

API Changes

Removed all previously deprecated methods and classes, notably the default Worker constructor. This is a breaking API change.

methods and classes, notably the default constructor. This is a breaking API change. Renamed NonBlockingWorker to ListenableWorker , which is now an unhidden public class and ready for usage. ListenableWorker provides access to one abstract method, ListenableFuture<Payload> onStartWork() which is called on the main thread. It is up to you to start and process work asynchronously. When finished, you should update the ListenableFuture appropriately. Reference implementations of ListenableFuture s are provided in the Futures package in alpha02 (see below the WorkManager section). Worker extends ListenableWorker and still operates as before, with an abstract Result doWork() method. Shuffled some methods and members from Worker to ListenableWorker . We shall soon provide reference implementations for ListenableWorker s that use Kotlin coroutines (once the stable versions are released) and RxJava2.

to , which is now an unhidden public class and ready for usage. The interface WorkerFactory and the concrete implementation DefaultWorkerFactory have been merged into an abstract class called WorkerFactory . The implementation ensures that the default reflection-based behavior is called as a last-ditch effort for any user-created WorkerFactory instances. This is a breaking change.

and the concrete implementation have been merged into an abstract class called . The implementation ensures that the default reflection-based behavior is called as a last-ditch effort for any user-created instances. This is a breaking change. Removed WorkManager.synchronous() and WorkContinuation.synchronous() and all related methods. Added ListenableFuture<Void> as the return type of many methods in the API. This is a breaking API change. You can now synchronously get and observe by using ListenableFuture s. For example, WorkManager.enqueue() used to return void ; it now returns a ListenableFuture<Void> . You can call ListenableFuture.addListener(Runnable, Executor) or ListenableFuture.get() to run code once the operation is complete. Note that these ListenableFuture s do not tell you if the operation succeeded or failed; only that they finished. You will still need to chain WorkManager methods to find out this information. We ignore cancel() calls on these objects, as they are confusing and hard to reason about (are you cancelling the operation or the resulting work?). This is within the Future s contract. To maintain parity with the synchronous getStatus* methods, we have provided ListenableFuture variants, and renamed the existing ones that returned LiveData to explicitly have "LiveData" as part of the name (for example, getStatusesByIdLiveData(UUID) ). This is a breaking API change.

and and all related methods. Added as the return type of many methods in the API. This is a breaking API change.

Bug Fixes

Fixed the known issue from alpha09 regarding duplicate androidx-annotations.pro files. You may remove the workaround from the previous release notes by deleting exclude 'META-INF/proguard/androidx-annotations.pro' from your gradle file.

files. You may remove the workaround from the previous release notes by deleting from your gradle file. Added proguard configurations to keep new Worker constructor. b/116296569

constructor. b/116296569 Fix potential NullPointerException in a race condition where work was REPLACE d. b/116253486 and b/116677275

in a race condition where work was d. b/116253486 and b/116677275 WorkContinuation.combine() now accepts one or more WorkContinuation s instead of two or more. b/117266752

Breaking API Changes

Removed all previously deprecated methods and classes, notably the default Worker constructor.

methods and classes, notably the default constructor. The interface WorkerFactory and the concrete implementation DefaultWorkerFactory have been merged into an abstract class called WorkerFactory .

and the concrete implementation have been merged into an abstract class called . Removed WorkManager.synchronous() and WorkContinuation.synchronous() .

and . WorkManager.getStatus*() methods now return ListenableFuture s. WorkManager.getStatus*LiveData() return LiveData s.

Version 1.0.0-alpha09

September 19, 2018

Known Issue

If you run into the following issue: "More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations.pro'", please put the following in your gradle file as a temporary workaround while we fix the issue in alpha10:

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

Bug Fixes

Added another fix that was needed for the "100 jobs" error. b/115560696

Added some fixes for foreign key constraint errors due to race conditions. b/114705286

Delegated ConstraintTrackingWorker.onStopped(boolean) calls to the underlying Worker . b/114125093

calls to the underlying . b/114125093 Enforce correct minimum backoff delay for Firebase JobDispatcher. b/113304626

Improved threading guarantees internal to the library.

Correct potential issue with deduping of LiveData internally.

API Changes

You can now create your own Worker instances at runtime by specifying a WorkerFactory as part of the WorkManager.Configuration . The fallback factory is DefaultWorkerFactory , which matches behavior of previous versions of WorkManager. The default constructors for Worker and NonBlockingWorker are now marked as deprecated. Please use the new constructor ( Worker(Context, WorkerParameters) ) and call super(Context, WorkerParameters) ; future versions of WorkManager will remove the default constructor.

instances at runtime by specifying a as part of the . The fallback factory is , which matches behavior of previous versions of WorkManager. We have started using the new ListenableFuture artifact internally (free of Guava dependencies). We will introduce ListenableFutures to the API in upcoming releases. This change will support the eventual unhiding of NonBlockingWorker .

artifact internally (free of Guava dependencies). We will introduce ListenableFutures to the API in upcoming releases. This change will support the eventual unhiding of . Add ability to trigger timed work in TestDriver via TestDriver.setInitialDelayMet(UUID) and TestDriver.setPeriodDelayMet(UUID) . b/113360060

Breaking Changes

The default Worker and NonBlockingWorker constructors are deprecated. Please migrate to the new constructor ASAP. Future versions will remove the default constructor.

Version 1.0.0-alpha08

August 27, 2018

Bug Fixes

Explicitly labelled WorkManager components as direct boot unaware so they don't fire up during direct boot. In the future, we will provide a version of WorkManager that is direct boot-aware. b/112665532

Fixed an issue where retried work was not running. b/112604021

Fixed periodic work not executing repeatedly (related to the above issue). b/112859683

Honored backoff policies when the app process is already running.

Corrected exception messages in Data to indicate the limit is 10KB.

to indicate the limit is 10KB. Lowered maximum value of Configuration.setMaxSchedulerLimit(int) to 50 to account for some latency in JobScheduler processing completion. b/112817355

Version 1.0.0-alpha07

August 16, 2018

Bug Fixes

Fixed a potential SQL query with negative limits that could return an unbounded number of results.

Work that has finished execution now correctly cancels all pending copies of that work in other Schedulers. This led to exceeding the JobScheduler jobs limit. b/111569265

jobs limit. b/111569265 Fixed a ConcurrentModificationException in ConstraintTracker . b/112272753

in . b/112272753 Changed return type annotations of Data.getBooleanArray(String) and Data.getIntArray(String) to @Nullable instead of @NonNull . b/112275229

API Changes

Worker now extends a new class, NonBlockingWorker . This does not affect any current usage. In the future, NonBlockingWorker will become a fully supported entity for custom threading solutions.

now extends a new class, . This does not affect any current usage. In the future, will become a fully supported entity for custom threading solutions. Changed return type annotations of Data.getBooleanArray(String) and Data.getIntArray(String) to @Nullable instead of @NonNull . b/112275229

and to instead of . b/112275229 Kotlin extensions: deprecated Map.toWorkData() and added a top-level workDataOf(vararg Pair<String, Any?>) to be more consistent with existing APIs.

Version 1.0.0-alpha06

August 1, 2018

Bug Fixes

Prevent a database lock when scheduling work. b/111801342

Fix a bug which causes PeriodicWork to not run on schedule when in Doze mode. b/111469837

to not run on schedule when in Doze mode. b/111469837 Fix a race condition when tracking constraints which causes WorkManager to crash. googlecodelabs/android-workmanager/issues/56

to crash. googlecodelabs/android-workmanager/issues/56 Create unique WorkRequest s when using WorkRequest.Builder#build() . b/111408337

s when using . b/111408337 Enable the use of RescheduleReceiver only when there are WorkRequest s that need it. b/111765853

Version 1.0.0-alpha05

July 24, 2018

API Changes

WorkManager.getInstance() is now annotated with @NonNull instead of @Nullable . Instead, if the singleton isn't properly initialized in cases of manual initialization, the method will throw an IllegalStateException . This is a breaking API change.

is now annotated with instead of . Instead, if the singleton isn't properly initialized in cases of manual initialization, the method will throw an . Added a new API, Configuration.Builder.setMinimumLoggingLevel(int) , which can control WorkManager verbosity. By default, WorkManager logs Log.INFO and above.

, which can control WorkManager verbosity. By default, WorkManager logs and above. Changed signature of Data.getString() so it no longer takes a default value (it is implicitly null ). This is a breaking API change.

so it no longer takes a default value (it is implicitly ). Marked some methods needed only for internal usage as @hide . This includes the Constraints constructor, Data.toByteArray() , and Data.fromByteArray(byte[]) . This is a breaking API change.

Bug Fixes

WorkManager no longer executes work during known cases of auto-backup. This could have resulted in a crash. b/110564377

Fixed double-scheduling of PeriodicWorkRequest s when using JobScheduler . b/110798652

s when using . b/110798652 Fixed an issue with PeriodicWorkRequest s not executing correctly after device doze. b/111469837

s not executing correctly after device doze. b/111469837 Fixed an issue with initial delays when using Firebase JobDispatcher. b/111141023

Fixed some potential race conditions and timing issues.

Correctly freed up BroadcastReceiver s that were no longer needed.

s that were no longer needed. Optimized rescheduling performance when apps restart after being force closed.

Allowed TestScheduler.setAllConstraintsMet(UUID) to be called before or after enqueuing the given WorkRequest . b/111238024

Breaking Changes

WorkManager.getInstance() is now annotated with @NonNull instead of @Nullable .

is now annotated with instead of . Changed signature of Data.getString() so it no longer takes a default value (it is implicitly null ).

so it no longer takes a default value (it is implicitly ). Marked some methods needed only for internal usage as @hide . This includes the Constraints constructor, Data.toByteArray() , and Data.fromByteArray(byte[]) .

Version 1.0.0-alpha04

June 26, 2018

Bug Fixes

PeriodicWorkRequest s are now correctly rescheduled when using the AlarmManager based implementation.

s are now correctly rescheduled when using the based implementation. Fixed a potential ANR when rescheduling all workers after a force stop or a reboot. b/110507716

Added nullability annotations to various WorkManager APIs. b/110344065

Log uncaught exceptions that occur during Worker execution. b/109900862

Allowed destructive database migrations in case you decide to roll back to an older version of WorkManager. b/74633270

Fixed a migration crash if creating duplicate implicit tags. This is a very rare issue that occurred only if you used the same implicit tag format yourself.

Version 1.0.0-alpha03

June 19, 2018

Bug Fixes

Fixed a race condition in the AlarmManager based implementation. b/80346526.

Fixed duplicate jobs when using JobScheduler after a device reboot.

Jobs with Content URI triggers now persist across reboots. b/80234744

Documentation updates. b/109827628, b/109758949, b/80230748

Fixed a crash when re-enqueuing a WorkRequest . b/109572353.

Fixed Kotlin compiler warnings when using the work-runtime-ktx dependency.

WorkManager now uses Room version 1.1.1-rc1 .

API Changes

Added getStatusesSync() , the synchronous version of WorkContinuation.getStatuses() .

, the synchronous version of . Worker has the ability to distinguish between user-initiated cancellation and temporary os-requested stopping. Worker.isStopped() returns true if any kind of stop has been requested. Worker.isCancelled() returns true when the work has been explicitly cancelled. b/79632247

has the ability to distinguish between user-initiated cancellation and temporary os-requested stopping. returns if any kind of stop has been requested. returns when the work has been explicitly cancelled. b/79632247 Add support for JobParameters#getNetwork() on API 28. This is exposed via Worker.getNetwork() .

. Added Configuration.Builder.setMaxSchedulerLimit(int maxSchedulerLimit) so you can enforce how many jobs can be sent to JobScheduler or AlarmManager . This helps prevent WorkManager from taking all your available JobScheduler slots.

so you can enforce how many jobs can be sent to or . This helps prevent from taking all your available slots. Added Configuration.setJobSchedulerJobIdRange(int minJobSchedulerId, int maxJobSchedulerId) which helps define a range of JobScheduler job ids safe for WorkManager to use. b/79996760

which helps define a range of job ids safe for to use. b/79996760 Worker.getRunAttemptCount() returns the current run count for a given Worker . b/79716516

returns the current run count for a given . b/79716516 WorkManager.enqueueUniquePeriodicWork(String uniqueWorkName, ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy, PeriodicWorkRequest periodicWork) allows you to enqueue a unique PeriodicWorkRequest s. b/79600647

allows you to enqueue a unique s. b/79600647 WorkManager.cancelAllWork() cancels all Worker s. Libraries that depend on WorkManager can query when this method was called last by using WorkManager.getLastCancelAllTimeMillis() for additional cleanup of internal state.

cancels all s. Libraries that depend on can query when this method was called last by using for additional cleanup of internal state. Added WorkManager.pruneWork() to remove completed jobs from the internal database. b/79950952, b/109710758

Behavior Changes

Added an implicit tag for all WorkRequest s, which is the fully qualified class name for the Worker . This allows the ability to remove WorkRequest s without tag s or when the id is not available. b/109572351

Breaking Changes

Renamed Worker.WorkerResult to Worker.Result .

to . Worker.onStopped now has an additional isCancelled parameter which is set to true when the Worker has explicitly been cancelled.

Version 1.0.0-alpha02

May 24, 2018

Bug Fixes

Fixed a NullPointerException on State.isFinished() . b/79550068

on . b/79550068 Fixed an issue which caused Worker s to be rescheduled on Application.onCreate() . b/79660657

s to be rescheduled on . b/79660657 Fixed an issue where you could schedule more work than is allowed by the OS. b/79497378

Moved cleanup of wake locks associated with Worker s to the background thread.

s to the background thread. The AlarmManager implementation now correctly cleans up when all pending work is complete.

implementation now correctly cleans up when all pending work is complete. Fixed cleanup SQL queries which affected non-English locales. b/80065360

Added support for float s in Data . b/79443878

s in . b/79443878 Data.Builder.putAll() now returns an instance of the Builder . b/79699162

now returns an instance of the . b/79699162 More javadoc and fixes in documentation. b/79691663

API Changes

Worker s can react to being stopped. Worker.isStopped() can be used to check if a Worker has been stopped. Worker.onStopped() can be used to perform lightweight cleanup operations.

s can react to being stopped. can be used to check if a has been stopped. can be used to perform lightweight cleanup operations. Worker.getTags() API returns a Set of tags associated with the Worker .

API returns a of tags associated with the . Added javax.time.Duration overloads for APIs which take a combination of duration and TimeUnit s. This is guarded by @RequiresApi(26) .

overloads for APIs which take a combination of duration and s. This is guarded by . WorkManager extensions have moved from the androidx.work.ktx package to the androix.work package. The old extensions are deprecated and will be removed in a future version.

extensions have moved from the package to the package. The old extensions are deprecated and will be removed in a future version. Configuration.withExecutor() is deprecated. Use Configuration.setExecutor() instead.

Version 1.0.0-alpha01

May 8, 2018