Jetpack WorkManager:后台任务别再只会Service了!
定义
JetPack中的一个组件:工作管理器。
特点
保证任务一定会被执行。(即使应用程序不在运行中/重启后)
❝原因:WorkManager会把任务相关的数据、信息都存储到自己的数据库里
❞
具体使用
主要包括:基础使用、链式任务使用、周期性使用和数据传递。
注:需先加依赖
// 1. 增加依赖
implementation "androidx.work:work-runtime:2.6.0-beta01"
1. 基础使用
// 1. 创建任务
// 继承Worker同时实现doWork():后续执行的任务会在这个方法里进行
public class carsonTestWork extends Worker {
public carsonTestWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.e("carsonho","执行完成");
return Result.success();
// 返回值类型为Result,有三种状态:
// 执行成功:Result.success()
// 执行失败:Result.failure()
// 需要重新执行:Result.retry()
}
}
// 2. 执行任务(外部调用)
OneTimeWorkRequest oneTimeWorkRequest =new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest); // 正常执行
OneTimeWorkRequest oneTimeWorkRequest =new OneTimeWorkRequest.Builder(carsonTestWork.class)..setInitialDelay(2, TimeUnit.SECONDS).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest); // 延迟执行
2. 链式执行任务
即连续执行多个任务,通过beginWith 跟 then设置。
// 1. 创建任务
public class carsonTestWork extends Worker {
public carsonTestWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.e("carsonho","执行完成");
return Result.success();
}
}
// 2. 链式执行一系列任务
ArrayList<OneTimeWorkRequest> workerRequests = new ArrayList();
// 任务1
OneTimeWorkRequest oneTimeWorkRequest1 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
// 任务2
OneTimeWorkRequest oneTimeWorkRequest2 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
// 存储到集合里
workerRequests.add(oneTimeWorkRequest1);
workerRequests.add(oneTimeWorkRequest2);
// 任务3
OneTimeWorkRequest oneTimeWorkRequest3 = new OneTimeWorkRequest.Builder(carsonTestWork.class).build();
// 通过beginWith 跟 then设置先后执行的任务
WorkManager.getInstance(this)
.beginWith(workerRequests)//先执行的任务
.then(oneTimeWorkRequest3)//后执行的任务
.enqueue();
3. 周期性任务
即重复循环执行任务,采用PeriodicWorkRequest实现。(上述提到的任务OneTimeWorkRequest属于一次性执行任务)
// 1. 创建任务
public class carsonTestWork extends Worker {
public carsonTestWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.e("carsonho","执行完成");
return Result.success();
}
}
// 2. 执行周期性任务任务
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
.Builder(PeriodicWork.class,15,TimeUnit.MINUTES) // 注:间隔不能少于15min
.build();
WorkManager.getInstance(this).enqueue(periodicWorkRequest);
4. 数据传递
// 1. activity向Worker传递数据
// 通过setInputData()
Data data = new Data.Builder().putString("data","Activity传过来的数据").build();
OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(carsonTestWork.class)
.setInputData(data)
.build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);
// 监听Worker回传的数据
WorkManager.getInstance(this)
.getWorkInfoByIdLiveData(oneTimeWorkRequest.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if(workInfo.getState().isFinished()){
Data outputData = workInfo.getOutputData();
}
}
});
// 2. Worker回传数据
// 放在复写的doWork()里的返回参数即可。
public class carsonTestWork extends Worker {
public carsonTestWork(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
String activityData = getInputData().getString("data");
Data data = new Data.Builder().putString("data","Worker回传的数据").build();
return Result.success(data);
}
「Carson每天带你学习一个Android知识点」,长按扫描关注公众号。同时,期待您精彩文章的投稿:真诚邀请您来分享
最后福利:学习资料赠送

福利:由本人亲自撰写 & 整理的「Android学习方法资料」 数量:10名 参与方式:「点击文章右下角”在看“ -> 回复截图到公众号 即可,我将从中随机抽取」 点击“在看”就能升职 & 加薪水哦!
评论