Android-Jetpack笔记-WorkManager

WorkManager能帮我们更好的管理后台任务,可以更好地管理执行时机、执行顺序和执行状态(有无网络、是否在充电)。他会根据系统版本选择合适的方案执行任务,比如在API 23及以上使用JobScheduler,以下则使用BroadcastReceiverAlarmManager,能兼容到API 14。同时,他会将任务存储进数据库来保证关机重启后任务仍可执行(这点有待验证,因为国内机型太多了)。

Jetpack笔记代码

本文源码基于SDK 29

使用

引入依赖:

1
2
def work_versions = "2.3.4"
implementation "androidx.work:work-runtime:$work_versions"

新建任务继承Worker

1
2
3
4
5
6
7
class MyWorker extends Worker {
@Override
public Result doWork() {
QrLog.e(getTags() + " doWork = " + getInputData().getString("input_data") + "," + Thread.currentThread());
return Result.success();
}
}

在activity中使用,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class WorkManagerActivity extends AppCompatActivity {
void onCreate(Bundle savedInstanceState) {
//创建要传递的参数,最大10KB
Data inputData = new Data.Builder().putString("input_data", "输入数据").build();

//创建约束条件
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true) //充电状态
.setRequiredNetworkType(NetworkType.CONNECTED) //网络连接
.setRequiresBatteryNotLow(true) //非低电量
.build();

//创建一次性请求
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
.setConstraints(constraints) //设置约束条件
.setInitialDelay(2, TimeUnit.SECONDS) //延迟2秒执行
.addTag("MyWorker") //设置标签
.setInputData(inputData) //设置输入数据
.build();
//还有周期性请求PeriodicWorkRequest,需要注意的是内部限制了最小周期为15分钟

//执行任务,可链式调用,workRequest2执行完了才执行workRequest
WorkManager.getInstance(this).beginWith(workRequest2).then(workRequest).enqueue();

//可以监听任务的工作状态
LiveData<List<WorkInfo>> liveData = WorkManager.getInstance(this).getWorkInfosByTagLiveData("MyWorker");
liveData.observe(this, new Observer<List<WorkInfo>>() {
@Override
public void onChanged(List<WorkInfo> workInfos) {
//do something
}
});
}
}

运行即可。

原理

暂不分析源码,引用掘金-[译] 从Service到WorkManager的一张流程图。

优缺点

  • 优点:
    • 使用方便,内部会根据不同系统选择合适方案
    • 能链式调度,让各任务按指定顺序执行
    • 能配置各种执行状态,如有无网络、是否在充电
    • 任务被存储进数据库,关机仍可执行(待验证)
  • 缺点:
    • 还没发现

参考