![27f33965-3c30-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/27f33965-3c30-eb11-8da9-e4434bdf6706.png)
1 引言
WorkManager是Android Jetpack的一个库,可以在达到约束条件的情况下执行可延期的有保证性的后台任务,适用于即便在应用退出后也要能保证运行的工作任务,是后台任务框架的优秀解决方案。
WorkManager又不完全是一个全新的后台任务框架,它的底层依然使用了Android之前的API,会根据设备的版本去选择调用调用JobScheduler或者Firebase JobDispatcher,或者AlarmManager来执行任务。上层封装了一致性API,让开发者不用再为设备版本不同去考虑不同的后台任务方案。
![29f33965-3c30-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/29f33965-3c30-eb11-8da9-e4434bdf6706.png)
除此之外,WorkManager还具备很多优点: 工作约束 强大的调度 灵活的重试策略 任务链接,按照需要依次执行 * 内置线程互操作性,无缝集成RxJava和协程
具体介绍查看官方文档
2 使用
开始使用WorkManager前,先添加如下依赖,WorkManager支持Java和kotlin,同时还增加了对协程和RxJava的支持。
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"
}
2.1 定义任务Worker
首先先要定义一个执行任务,这里定义一个循环执行上传图片的任务。
import androidx.work.Worker
import androidx.work.WorkerParameters
class UploadWorker(
val context: Context, workerParams: WorkerParameters
) : Worker(context, workerParams) {
override fun doWork(): Result {
uploadImg()
return Result.success();
}
fun uploadImg() {
while (true) {
// 模拟上传耗时
Thread.sleep(1000)
Log.d("workermanager", "uploadImg...")
}
}
}
定义一个任务都需要继承WorkManager的抽象类Worker,并且重写doWork()方法,这里是你要执行的操作代码,doWork()返回的 Result 会通知 WorkManager 服务工作是否成功,以及工作失败时是否应重试工作,有三种: Result.success() 任务执行成功 Result.failure() 任务执行失败 * Result.retry() 任务执行失败,按照重试策略进行重试
2.2 创建WorkRequest
// 单次任务
val req1: WorkRequest = OneTimeWorkRequest.from(UploadWorker::class.java)
// 周期任务,最短间隔15分钟
val req2 = PeriodicWorkRequestBuilder<UploadWorker>(15, TimeUnit.MINUTES).build()
// 增加约束,仅在用户设备正在充电且连接到 Wi-Fi 网络时才会运行
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(true)
.build()
val req3: WorkRequest = OneTimeWorkRequestBuilder<MyWork>()
.setInitialDelay(10, TimeUnit.MINUTES) // 延迟10分钟
.setConstraints(constraints)
.build()
还有更多的创建WorkRequest也可以查阅官方文档,这里只给出最简单的例子,抓住主线,为后面解析代码做准备。
2.3 执行WorkRequest
WorkManager.getInstance(mContext).enqueue(request)
// 执行唯一任务
WorkManager.getInstance(mContext).enqueueUniqueWork(uniqueWorkName,existingWorkPolicy,request)
// 定期执行唯一任务
WorkManager.getInstance(mContext).enqueueUniquePeriodicWork(uniqueWorkName,existingWorkPolicy,request)
3 源码解析
上面介绍了一个最简单的从创建任务到执行的过程,下面就沿着这条主线来分析源代码。
3.1 Worker
一次性Worker的生命周期如图所示:
![2af33965-3c30-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/2af33965-3c30-eb11-8da9-e4434bdf6706.png)