概述
对于满足网络、电量、时间等一定预定条件而触发的任务,那么jobScheduler便是绝佳选择。JobScheduler主要用于在未来某个时间下满足一定条件时触发执行某项任务的情况,那么可以创建一个JobService的子类,重写其onStartJob()方法来实现这个功能。
JobScheduler的schedule过程:
JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName jobService = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(123, jobService) // 任务Id等于123
.setMinimumLatency(5000)// 任务最少延迟时间
.setOverrideDeadline(60000)// 任务deadline,当到期没达到指定条件也会开始执行
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 网络条件,默认值NETWORK_TYPE_NONE
.setRequiresCharging(true)// 是否充电
.setRequiresDeviceIdle(false)// 设备是否空闲
.setPersisted(true) // 设备重启后是否继续执行
.setBackoffCriteria(3000,JobInfo.BACKOFF_POLICY_LINEAR) // 设置退避/重试策略
.build();
scheduler.schedule(jobInfo);
JobScheduler 的 cancel 过程:
scheduler.cancel(123); // 取消jobId=123的任务
scheduler.cancelAll(); // 取消当前uid下的所有任务
可以看到,JobScheduler 这个类只是一个客户端的代理类,代码位于:
frameworks/base/core/java/android/app/job/JobScheduler.java
1 JobScheduler
package android.app.job;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import java.util.List;
public abstract class JobScheduler {
// 调用 schedule 方法返回的结果码
public static final int RESULT_FAILURE = 0;
public static final int RESULT_SUCCESS = 1;
// 注册一个任务到系统中!
public abstract int schedule(JobInfo job);
@SystemApi
public abstract int scheduleAsPackage(JobInfo job, String packageName, int userId, String tag);
- // 取消该 package 设置的 ID 为 iobId 的任务!
public abstract void cancel(int jobId);
- // 取消该 package 设置的所有 Job!
public abstract void cancelAll();
public abstract @NonNull List<JobInfo> getAllPendingJobs();
public abstract @Nullable JobInfo getPendingJob(int jobId);
}
上面是应用中调用的 JobScheduler 对象,他是一个抽象类;实际上,我们获得的是服务端的代理对象:JobSchedulerStub 对象,他继承了 IJobScheduler.Stub!详情,请看第二篇!