WorkManager初体验
随着Android版本的越来越多,后台任务处理变得复杂。
在Android5.0以下,我们使用AlarmManager来执行定时任务,在Android5.0以上,我们使用JobSchedule来执行定时任务,这样子要根据版本来判断使用哪个,过于麻烦
Google最近在IO大会上发布了 WorkManager来帮助开发者解决这一问题
WorkManager使用
引用包:
workManager包的引用:compile ("android.arch.work:work-runtime:1.0.0-alpha01")
调用方法:
/**
* 重复闹钟
*
* @param cls 要执行的work类
* @param time 间隔时间
* @param unit 间隔时间单位
* @return id 任务id
*/
public String periodWork(Class<? extends Worker> cls, long time, TimeUnit unit) {
Constraints constraints = new Constraints();
//网络连接
constraints.setRequiredNetworkType(NetworkType.CONNECTED);
//是否充电
constraints.setRequiresCharging(true);
//设备空闲
constraints.setRequiresDeviceIdle(true);
PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(cls, time, unit)
//执行条件
.setConstraints(constraints)
//添加tag,用于查找或者取消任务
.addTag("periodWork")
.build();
//执行
WorkManager.getInstance().enqueue(workRequest);
return workRequest.getId().toString();
}
/**
* 单次闹钟
*
* @param cls 要执行的work类
* @param time 间隔时间
* @param unit 间隔时间单位
*/
public String oneTimeWork(Class<? extends Worker> cls, long time, TimeUnit unit) {
Constraints constraints = new Constraints();
//网络连接
constraints.setRequiredNetworkType(NetworkType.CONNECTED);
//是否充电
constraints.setRequiresCharging(true);
//设备空闲
constraints.setRequiresDeviceIdle(true);
OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(cls)
//延时执行时间
.setInitialDelay(time, unit)
//执行条件
.setConstraints(constraints)
.addTag("oneTimeWork")
.build();
WorkManager.getInstance().enqueue(workRequest);
return workRequest.getId().toString();
}
调用:
//注意,使用内部类的时候必须是静态的
public static class CheckServiceWork extends Worker {
@NonNull
@Override
public WorkerResult doWork() {
//your work
return WorkerResult.SUCCESS;
}
}
注意,使用内部类的时候必须是静态的
public static class CheckServiceWork extends Worker {
@NonNull
@Override
public WorkerResult doWork() {
//your work
return WorkerResult.SUCCESS;
}
}
//15分钟轮训一次
WorkSchedule.getInstance().periodWork(CheckServiceWork.class,15, TimeUnit.MINUTES);
//15分钟后执行 ,只执行一次
WorkSchedule.getInstance().timeWork(CheckServiceWork.class, 15, TimeUnit.SECONDS);
不过经测试,定时不是特别的准确