49. WorkManager的使用和原理
简介
WorkManger是Android Jetpack提供执行后台任务管理的组件,它适用于需要保证 系统即使应用程序退出也会运行的任务,WorkManager API可以轻松指定可延迟的 异步任务以及何时运行它们,这些API允许您创建任务并将其交给WorkManager立 即运行或在适当的时间运行。
WorkManager根据设备API级别和应用程序状态等因素选择适当的方式来运行任 务。如果WorkManager在应用程序运行时执行您的任务之一,WorkManager可以 在您应用程序进程的新线程中运行您的任务。如果您的应用程序未运行, WorkManager会选择一种合适的方式来安排后台任务 - 具体取决于设备API级别和包 含的依赖项,WorkManager可能会使用 JobScheduler,Firebase JobDispatcher或 AlarmManager
WorkManager作用
一:确保重要的后台任务,一定会被执行,后台任务(例如:非及时性的 (请求服 务器 及时性) 上传,下载,同步数据 等)
二:内部对电量进行了优化,不需要我们去处理电量优化了
三:API 14 到 最新版本,都可以使用WorkManager来管你你的后台任务
四:注意:WorkManager不能做保活操作 (重复执行后台任务的最少执行单位是 15分钟,源码内部限制)
WorkManager的各个角色
Worker:指定需要执行的任务,可以成为Workder类的子类,在实
现的方法中,就可以执行任务逻辑了
WorkRequest:执行一项单一的任务
第一点:必须知道 WorkRequest对象,必须指定Work执行的任务
第二点:需要知道 WorkRequest都有一个自动生成的唯一ID,可以使用ID执行取消 排队任务 或 获取任务状态等操作
第三点:需要知道 WorkRequest是一个抽象的类;系统默认实现子类 OneTimeWorkRequest或PeriodicWorkRequest
第四点:需要知道 WorkRequest.Builder创建WorkRequest对象;相应的子类: OneTimeWorkRequest.Builder或PeriodicWorkRequest.Builder
第五点:需要知道 Constraints:指定对任务运行时间的限制(任务约束);使用 Constraints.Builder创建Constraints对象 ,并传递给WorkRequest.Builder
主线流程
使用方式
implementation "androidx.work:work-runtime:2.3.4"
1.创建一个任务
创建一个类,继承自Worker
public class MainWorker1 extends Worker {
private final static String TAG = MainWorker1.class.getSimpleName();
public MainWorker1(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
// 后台任务 并且 异步的
@NonNull
@Override
public Result doWork() {
Log.d(TAG, "MainWorker1 doWork: run started ... ");
try {
Thread.sleep(8000); // 睡眠
} catch (InterruptedException e) {
e.printStackTrace();
return Result.failure(); // 本次任务失败
} finally {
Log.d(TAG, "MainWorker1 doWork: run end ... ");
}
return Result.success(); // 本次任务成功
}
}
2.执行任务
OneTimeWorkRequest oneTimeWorkRequest =
new OneTimeWorkRequest.Builder(MainWorker1.class).build();
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);