JobScheduler/JobService/JobInfo

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)一起使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值