JobScheduler 实现 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下执行任务
JobScheduler 简介
使用场景
- 应用保活
- 特定时间,特定条件(系统空闲,电池电量,磁盘空间 ……)下运行程序
JobScheduler 提供分发各种条件的任务(通过 JobInfo构建),这个任务由系统在满足你设置的条件下执行(执行是通过调用JobService)。系统在执行任务时会批量和尽可能的延迟执行,如不设置deadline 的话,这个任务可能在任何延后的时刻执行。任务执行时你的app持有wakelock锁,保证任务能执行下去不会休眠
note:
从API 30 (Build.VERSION_CODES.R)10.0+开始,JobScheduler 的schedule调用会导致app bug,并且这个无视
target SDK version;也就是API 30不能再使用JobScheduler
JobScheduler 对象获取
JobScheduler是在Android 5.0中才有的
//JobScheduler系统服务获取
JobScheduler jobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE );
JobInfo构建
ComponentName serviceName = new ComponentName("yourPackageName",
"^.MyJobService");
JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
//.setMinimumLatency(3000)
.setPeriodic(15 * 60 * 1000)
.build();
JobInfo提供的方法参数解释:
方法 | 说明 |
---|---|
public Builder(int jobId, @NonNull ComponentName jobService) | Builder构建构造函数;jobId:区别不同JobInfo ;ComponentName :指定满足条件后执行的jobService包名和类名 |
以下是设置时间相关条件 | |
setMinimumLatency(long minLatencyMillis) | 设置任务执行的最小延迟时间,也就是minLatencyMillis时间之后执行,可能无限之后,需要配合setOverrideDeadline使用;不能和periodic job一起使用,会在build()的时候抛出参数异常 |
setOverrideDeadline(long maxExecutionDelayMillis) | 设置任务执行的最大延迟时间,可以与setMinimumLatency配合使用,这样就是在一个时间区间内执行 |
setPeriodic(long intervalMillis, long flexMillis) | 设置任务在一个时间周期重复执行,并且有一个弹性时间;执行序列start–>[flex,period]–>[flex,period]…… ;参数要求:intervalMillis要>getMinPeriodMillis(),否则就使用系统默认的getMinPeriodMillis()=15 minutes;flexMillis 要大于A=max(getMinFlexMillis()=5 minutes ,intervalMillis * 5%) ,否则就使用A |
setPeriodic(long intervalMillis) | 直接调用setPeriodic(intervalMillis, intervalMillis) |
以下是设置机器状态的相关条件 | |
setRequiredNetworkType(@NetworkType int networkType) | 设置需要的网络状况 |
setRequiresCharging(boolean requiresCharging) | 设置是否需要设备插电中,默认false |
setRequiresBatteryNotLow(boolean batteryNotLow) | 设置是否在电池非低状态 |
setRequiresDeviceIdle(boolean requiresDeviceIdle) | 设置是否在设备空闲状态 |
setRequiresStorageNotLow(boolean storageNotLow) | 设置是否在磁盘非低状态 |
设置完条件后,需要执行得到JobInfo 对象 | |
public JobInfo build() | 构建出JobInfo 对象,采用了Builder设计模式 |
JobService 定义
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
需要在AndroidManifest.xml中注册
<service
android:name="…….MyJobService "
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler通过JobInfo调用JobService
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(1, new ComponentName(context.getPackageName(), MyJobService.class.getName()));
/**
* 5分钟后执行,可能一直延后
* 这个设置不能和周期性任务一起设置
*/
builder.setMinimumLatency(5 * 60 * 1000);
/**
* 截止到20分钟之前执行;设置了这个Deadline,requirements相关条件不满足也会执行
* 这个设置不能和周期性任务一起设置
*/
builder.setOverrideDeadline(20 * 60 * 1000);
/**
* 设置需要的网络条件
*
* 如果设置了这个requirements又设置了setOverrideDeadline可以通过
* JobService中的onStartJob(JobParameters params)中的isOverrideDeadlineExpired()判断是不是由Deadline触发
*/
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
JobInfo jobInfo = builder.build();
scheduler.schedule(jobInfo);
}
版本对JobScheduler 的影响
谷歌开发文档:
Note: Beginning with API 30 (Build.VERSION_CODES.R), JobScheduler will throttle runaway applications. Calling schedule(android.app.job.JobInfo) and other such methods with very high frequency is indicative of an app bug and so, to make sure the system doesn’t get overwhelmed, JobScheduler will begin to throttle apps that show buggy behavior, regardless of target SDK version.
API 30开始JobScheduler 将会报错,哪怕你把target SDK 调低也没用
此文要是对你有帮助,如果方便麻烦点个赞,谢谢!!!
本文地址:https://blog.csdn.net/kingyc123456789/article/details/107236350
上一篇: vue移动端轻量级的轮播组件实现代码
下一篇: 如何利用nodejs实现命令行游戏