文中的源代码版本为api23java
想一想看,若是一个应用程序须要执行一些后台任务,你会怎么实现? AlarmManager? Service? 又或者是SyncManager?android
今天咱们来学习另外一种解决方案:JobScheduler
。 JobScheduler
是在Android 5.0添加的,它能够检测网络状态、设备是否充电中、低电量、低存储等状态,当全部条件都知足时就会触发执行对应的JobService
来完成任务。同时具有了重试、定时执行、持久化任务(设备重启后可恢复任务)等功能。可谓是十分强大。 你们能够查看该视频或者该文章了解个大概。api
JobScheduler
的使用大体分为三步网络
JobService
类JobInfo
JobScheduler
系统服务执行任务JobScheduler
的原理大体是是经过监听手机状态,当条件知足时启动Service
执行任务。 所以在使用JobScheduler
以前,咱们须要定义一个Service
,固然并非随随便便定义,而是须要派生自JobService
。 只须要重写onStopJob
和onStartJob
便可。app
class DemoJobService: JobService() {
override fun onStartJob(params: JobParameters?): Boolean {
//do sth...
//这个返回值是有讲究的
//true表示Service的工做在一个独立线程中执行,工做完成以后须要调用jobFinish方法通知JobScheduler工做完成
//false表示Service的工做已经完成,JobScheduler收到通知以后会释放资源
return false
}
//该方法会在一些极端场景下触发
//好比当前的Job须要有Wifi链接的场景下才可执行,可是在执行期间
//用户关闭Wifi,那么就会触发该方法
override fun onStopJob(params: JobParameters?): Boolean {
//do sth...
//true表示须要进行重试
//false表示再也不进行重试,Job将会被丢弃
return true
}
}
复制代码
同时,在manifest
中注册时,还须要设置一个权限(不然会报错),以下ide
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
//...
<service android:name=".DemoJobService" android:permission="android.permission.BIND_JOB_SERVICE"/>
</application>
复制代码
JobInfo
是对任务的描述,好比说须要监听哪些状态、重试策略、任务执行时间、是否持久化等等。 JobInfo.Builder
的构造函数须要传入一个jobId
,是Job
的惟一标志,后续经过该jobId
来取消Job
。 经过Builder
模式构造JobInfo
。函数
val jobInfo = JobInfo.Builder(1, ComponentName(packageName, DemoJobService::class.java.name))
.setBackoffCriteria(1000,JobInfo.BACKOFF_POLICY_LINEAR) //重试机制
.setMinimumLatency(1000)//设置延迟时间
.setOverrideDeadline(10000)//设置最后期限,若是达到该时间点,Job还没被执行,那么会强制执行一次
// .setPeriodic(2000)//每隔2s执行一次,跟上面两个会冲突
.setPersisted(true)//持久化,就算手机关机,启动以后也能够恢复Job,须要RECEIVE_BOOT_COMPLETED权限
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)//设置Job依赖的网络类型
.setRequiresCharging(false)//是否要求设备处于充电状态
.setRequiresDeviceIdle(false)//是否要求设备处于空闲状态
.build()
复制代码
最后经过getSystemService
获取JobScheduler
服务执行任务就能够了学习
//执行任务
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(jobInfo)
//取消任务
jobScheduler.cancel(1)
复制代码
JobScheduler
上手仍是比较简单的,因为本文是基于api23的源码,所以还有不少新功能没有在源码中展现出来,如setRequiresBatteryNotLow
(设置Job
对电量的要求)、setRequiresStorageNotLow
(设置Job
对存储空间的要求)等,你们有兴趣能够本身去了解一下。 后续,我会从源码角度分析JobScheduler
的工做原理。ui