概览
JobScheduler是android系统提供的一个任务执行框架,通过JobScheduler我们可以根据不同的策略调度任务的执行。
例如:
- 指定任务可以在指定的网络下执行
- 指定任务只在充电的状态下进行
- 设置任务的截止时间
- 指定延迟一段时间后执行任务
- 指定任务在手机空闲的情况下执行
如果app被杀死则无法最终执行任务,如果有重启后需要继续执行
这种需要建议使用WorkManager
使用
基本使用
创建自定义JobService并在manifest中配置
class ExeTaskAfter2SecondService: JobService() { override fun onStartJob(params: JobParameters?): Boolean { logEE("延迟五秒执行:onStartJob") return true } override fun onStopJob(params: JobParameters?): Boolean { logEE("延迟五秒执行:onStopJob") return true } } 复制代码
<service android:name=".service.ExeTaskAfter2SecondService" android:permission="android.permission.BIND_JOB_SERVICE" /> 复制代码
调度任务执行
val mJobScheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler//获取系统服务 val mBuilder = JobInfo.Builder(1, ComponentName(this, ExeTaskAfter2SecondService::class.java))//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service var mJobInfo = mBuilder .setMinimumLatency(5000)//指定5s后执行任务 .build() mJobScheduler.schedule(mJobInfo)//开始调度任务执行 复制代码
取消任务执行
mJobScheduler.cancel(1)//这个id就是schedule时指定的任务id mJobScheduler.cancelAll()//取消全部任务 复制代码
设置任务的截止时间
var mJobInfo = mBuilder .setOverrideDeadline(5000)//五秒内一定会执行一次 .build() mJobScheduler.schedule(mJobInfo) 复制代码
设置任务执行的网络状态
只在移动网络的时候执行
如果开始任务时没有连接无线网络则不执行,然后当我们连接无线网络时会自动开始执行网络
val mBuilder = JobInfo.Builder( 1, ComponentName(this, ExeTaskAfter2SecondService::class.java) )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service var mJobInfo = mBuilder .setRequiredNetworkType(JobInfo.NETWORK_TYPE_CELLULAR) .build() mJobScheduler.schedule(mJobInfo)//开始调度任务执行 复制代码
指定job执行时的网络流量大小限制
感觉基本用不上,打不情况我们不会考虑流量,所以我也没有测试
setEstimatedNetworkBytes (long downloadBytes, long uploadBytes) 复制代码
设置非低电量时执行
setRequiresBatteryNotLow 复制代码
必须有网络连接的时候才能执行
NETWORK_TYPE_ANY
无论是否有网络都可以执行
NETWORK_TYPE_NONE
只有wifi情况下才能执行
NETWORK_TYPE_UNMETERED
指定任务在手机空闲时执行
setRequiresDeviceIdle
这种方式很难预测
val mBuilder = JobInfo.Builder( 1, ComponentName(this, ExeTaskAfter2SecondService::class.java) )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service var mJobInfo = mBuilder // .setOverrideDeadline(5000)//如果设置了dealline时间,则即使设置了setRequiresDeviceIdle到达截止时间时也会执行 .setRequiresDeviceIdle(true) .build() mJobScheduler.schedule(mJobInfo)//开始调度任务执行 复制代码
设置充电的状态下才能执行
如果我们执行任务时,手机没有充电则不会执行,当我们插上电源的时候任务会自动开始执行
mJobScheduler = getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler val mBuilder = JobInfo.Builder( 1, ComponentName(this, ExeTaskAfter2SecondService::class.java) )//Builder第一个参数是Job的id,我们可以通过这个id取消任务,第二个参数可以配置要执行任务逻辑的Service var mJobInfo = mBuilder .setRequiresCharging(true)//设置充电时才能执行 .build() mJobScheduler.schedule(mJobInfo)//开始调度任务执行 复制代码
api介绍
JobService.onStartJob
JobScheduler.schedule调用的时候会回调onStartJob方法
onStartJob方法的返回值:
如果返回false表示该任务随方法执行完成而结束,后续不会再调用onStopJob方法(即使我们主动调用了cancel方法)
如果返回true则方法可以被反复执行
JobService.onStopJob
调用JobSchdeuler.cancel会触发onStopJob回调
JobService.jobFinished
jobFinished(params,false):第一个参数JobParameters,第二个参数表示是否重复执行 复制代码
主动通知系统已经完成了任务