WorkManager用于管理那些后台中定时执行的任务,即使你的应用没启动或你的设备重启。
它提供了从其他API(例如JobScheduler,Firebase.JobDispatcher,AlarmManager和Services)中获得的功能,而无需研究哪种API可用于您的设备或API。
使用步骤:
1.引入依赖
dependencies {
...
def work_version = "1.0.0-alpha02"
implementation "android.arch.work:work-runtime:$work_version"
}
2.新建类继承自Worker类,重写其doWork方法,并将具体业务逻辑写在其中
public class MyWork extends Worker {
@NonNull
@Override
public WorkerResult doWork() {
Notification notification = new NotificationCompat.Builder(getApplicationContext())
.setContentTitle("我是通知")
.setContentText("你好")
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(),R.drawable.pig))
.setAutoCancel(true)
.setWhen(System.currentTimeMillis())
.build();
NotificationManagerCompat.from(getApplicationContext()).notify(0,notification);
//WorkerResult.SUCCESS:成功
//WorkerResult.FAILURE:失败
//WorkerResult.RETRY:失败后会重新在尝试执行
return WorkerResult.SUCCESS;
}
}
3.创建WorkRequest对象,用于指定执行哪个任务,因为WorkRequest是个抽象类,所以用它的子类OneTimeWorkRequest(只执行一次) 或 PeriodicWorkRequest(执行多次)。
//只执行一次的任务
OneTimeWorkRequest request1 = new OneTimeWorkRequest.Builder(MyWork.class).build();
//执行多次的任务
PeriodicWorkRequest request2 = new PeriodicWorkRequest.Builder(MyWork.class,15, TimeUnit.MINUTES).build();
4.创建WorkManager使任务入队
WorkManager.getInstance().enqueue(request1);
WorkManager.getInstance().enqueue(request2);
整个流程创建完毕,上面的例子创建了一个每隔15分钟执行一次任务的应用程序。
进阶
为Work的执行条件添加限制
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true)
.setRequiresDeviceIdle(true)
.build();
OneTimeWorkRequest request1 = new OneTimeWorkRequest.Builder(MyWork.class).setConstraints(constraints).build();
取消任务
当我们将任务入列后,我们还可以取消这个任务。要取消任务,我们需要这个任务的Work ID,当然Work ID可以从WorkRequest对象中获取。
UUID compressionWorkId = request1.getId();
WorkManager.getInstance().cancelByWorkId(compressionWorkId);
链式任务
有时候我们想让应用程序按照特定的顺序运行多个任务。 WorkManager允许我们创建和排队多个任务的工作序列,以及它们应该以什么顺序运行。
WorkManager.getInstance()
.beginWith(workA)
.then(workB)
.then(workC)
.enqueue();
我们可以通过使用WorkContinuation.combine()方法连接多个链来创建更复杂的序列。例如,假设我们想要像下图运行一个序列:
WorkContinuation chain1 = WorkManager.getInstance()
.beginWith(workA)
.then(workB);
WorkContinuation chain2 = WorkManager.getInstance()
.beginWith(workC)
.then(workD);
WorkContinuation chain3 = WorkContinuation
.combine(chain1, chain2)
.then(workE);
chain3.enqueue();