天天看点

JobScheduler用法

JobScheduler是Android L(API21)5.0新增的特性,它可以将作业推迟(合并)到稍后或指定条件下(如设备充电或连入 WLAN 时)执行来优化电池寿命

JobScheduler文档

JobScheduler 例子

近几个android版本中针对电量优化功能

JobScheduler用法:

  • 1.创建一个MyJobService继承自JobService(具体业务逻辑实现)

实现以下两个抽象方法:

onStartJob:
在任务开始执行时触发.返回false表示执行完毕,返回true表示需要开发者自己调用jobFinished方法通知系统已执行完成
onStopJob:
在任务停止执行时触发(jobFinished不会直接触发onStopJob)
           
public class MyJobService extends JobService {
    
        @Override
        public boolean onStartJob(JobParameters params) {
            return false;
        }
    
        @Override
        public boolean onStopJob(JobParameters params) {
            return false;
        }
    }
           

AndroidManifest.xml声明:

<service
            android:name=".service.SimpleJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />
           
  • 2.Activity中配置JobInfo,

    JobInfo指定了一个任务的概要信息,比如何时启动,启动时需要满足什么条件等等

JobInfo.Builder builder = new JobInfo.Builder(jobId, mServiceComponent)
            .setMinimumLatency(2000) // 设置任务最少延迟多久后执行
            .setOverrideDeadline(50000) // 设置最多延迟多久后执行(若到期还没有到达规定的条件也会执行)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) //设置网络条件,非数据
            .setRequiresCharging(true) // 是否在充电时执行
            .setRequiresDeviceIdle(false); // 是否在空闲idle时执行(设备有一段时间没有使用时才会启动该任务)

    // Schedule job
    JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    tm.schedule(builder.build());
           
> setRequiredNetworkType:设置网络条件:
    JobInfo.NETWORK_TYPE_NONE(无网络时执行,默认)
    JobInfo.NETWORK_TYPE_ANY(有网络时执行)
    JobInfo.NETWORK_TYPE_UNMETERED(网络无需付费时执行,数据流量)
> setPersisted(boolean isPersisted):
    设备重启之后你的任务是否还要继续执行
> setPeriodic:
    设置时间间隔,单位毫秒(该方法不能和setMinimumLatency、setOverrideDeadline这两个同时调用)
setRequiredNetworkType(int networkType):
这个方法让你这个任务只有在满足指定的网络条件时才会被执行。默认条件是JobInfo.NETWORK_TYPE_NONE,这意味着不管是否有网络这个任务都会被执行。另外两个可选类型,一种是JobInfo.NETWORK_TYPE_ANY,它表明需要任意一种网络才使得任务可以执行。另一种是JobInfo.NETWORK_TYPE_UNMETERED,它表示设备不是蜂窝网络( 比如在WIFI连接时 )时任务才会被执行。
> setBackoffCriteria:
    退避策略,可以设置等待时间以及重连策略
           

需要注意的是setRequiredNetworkType, setRequiresCharging 和 setRequiresDeviceIdle这几个方法可能会使得你的任务无法执行.非调用setOverrideDeadline(long time)设置了最大延迟时间,得你的任务在为满足条件的情况下也会被执行.

  • 3.执行JobScheduler
// Schedule job
    JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    if(js.schedule(builder.build()) == JobScheduler.RESULT_FAILURE ) {
        // the result of the schedule request
    }
           
> schedule: 把指定的JobInfo对象放入调度队列,满足条件时触发该对象中定义的JobService
> cancel: 取消指定编号的任务
> cancelAll: 取消所有任务
> getAllPendingJobs: 获取所有挂起(未执行)的任务