JobScheduler是Android5.0 开始引入了一个新系统服务。
它将后台任务调度直接交给系统服务(JobSchedulerSevice)管理,
并且可以设置许多约束条件,如周期调度,延迟调度,网络连接,电源插入,还有AndroidL引入的空闲模式,
在条件符合的情况下,系统服务BindService的方式把应用内Manifest中配置的JobService启动起来,
并通过进程间通信Binder方式调用JobService的onStartJob、onStopJob等方法来进行Job的管理。
即便在执行任务之前应用程序进程被杀,也不会导致任务中断,Jobservice不会因应用退出而退出,但确实是运行在该应用进程中。
创建 JobService
我们具体的业务逻辑还是要写在jobService中的, 所以自定义一个服务继承自JobService 并重写两个抽象方法
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) //Android5.0 API21之上可用
public class MyJobService extends JobService {
//在任务开始执行时触发。
//返回false表示执行完毕,
//返回true表示需要开发者自己调用jobFinished方法通知系统已执行完成。
@Override
public boolean onStartJob(JobParameters params) {
return false;
}
//在任务停止执行时触发。
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
注册:
<service
android:name=".MyJobService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
Activity中配置 JobInfo (Builder模式)
JobInfo是从来描述任务的执行时间,条件,策略等一系列的行为,使用Builder模式来获取实例
//MyJobService extends JobService
JobInfo.Builder builder = new JobInfo.Builder(HASH_CODE,
new ComponentName(DaemonEnv.sApp, MyJobService.class));
//设置时间间隔,单位毫秒。该方法不能和setMinimumLatency、setOverrideDeadline这两个同时调用
builder.setPeriodic(DaemonEnv.getWakeUpInterval());
//Android 7.0+ 增加了一项针对 JobScheduler 的新限制,最小间隔只能是下面设定的数字
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
builder.setPeriodic(JobInfo.getMinPeriodMillis(), JobInfo.getMinFlexMillis());
// builder.setMinimumLatency(TimeUnit.MILLISECONDS.toMillis(5000)); //执行的最小延迟时间,ms
// builder.setOverrideDeadline(TimeUnit.MILLISECONDS.toMillis(5000)); //执行的最长延时时间,ms
builder.setRequiresCharging(false); // 是否在充电时执行
builder.setRequiresDeviceIdle(true); //是否在空闲时执行
/** 默认条件,不管是否有网络这个作业都会被执行 */
//public static final int NETWORK_TYPE_NONE = 0;
/** 任意一种网络这个作业都会被执行 */
//public static final int NETWORK_TYPE_ANY = 1;
/** 不是蜂窝网络( 比如在WIFI连接时 )时作业才会被执行 */
//public static final int NETWORK_TYPE_UNMETERED = 2;
/** 不在漫游时作业才会被执行 */
//public static final int NETWORK_TYPE_NOT_ROAMING = 3;
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
// Extras, work duration.
PersistableBundle extras = new PersistableBundle();
extras.putString("key", "value");
builder.setExtras(extras);
//重启后是否还要继续执行,此时需要声明权限RECEIVE_BOOT_COMPLETED
builder.setPersisted(true);
Activity中使用 JobScheduler 执行 JobInfo
JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.schedule(builder.build());
注意:
setBackoffCriteria(long initialBackoffMillis, int backoffPolicy)
设置后退/重试策略。
两种可选策略:
BACKOFF_POLICY_EXPONENTIAL: 时间呈指数形式增长,默认值。
BACKOFF_POLICY_LINEAR:时间呈线性形式增长
setMinimumLatency(long interval)
设置最小的延迟时间
和setOverrideDeadline(long interval)设置最大延迟时间,
这两个方法不能和setPeriodic(long interval)一起使用