WorkManager

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();

猜你喜欢

转载自blog.csdn.net/qq_37918409/article/details/81207492