JobScheduler之入门

文中的源代码版本为api23java

JobScheduler入门

想一想看,若是一个应用程序须要执行一些后台任务,你会怎么实现? AlarmManager? Service? 又或者是SyncManager?android

今天咱们来学习另外一种解决方案:JobSchedulerJobScheduler是在Android 5.0添加的,它能够检测网络状态、设备是否充电中、低电量、低存储等状态,当全部条件都知足时就会触发执行对应的JobService来完成任务。同时具有了重试、定时执行、持久化任务(设备重启后可恢复任务)等功能。可谓是十分强大。 你们能够查看该视频或者该文章了解个大概。api

JobScheduler的使用大体分为三步网络

  1. 建立JobService
  2. 建立一个JobInfo
  3. 获取JobScheduler系统服务执行任务

1 建立JobService

JobScheduler的原理大体是是经过监听手机状态,当条件知足时启动Service执行任务。 所以在使用JobScheduler以前,咱们须要定义一个Service,固然并非随随便便定义,而是须要派生自JobService。 只须要重写onStopJobonStartJob便可。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>
复制代码

2 建立JobInfo

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()
复制代码

3 执行任务

最后经过getSystemService获取JobScheduler服务执行任务就能够了学习

//执行任务
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(jobInfo)

//取消任务
jobScheduler.cancel(1)
复制代码

4 最后

JobScheduler上手仍是比较简单的,因为本文是基于api23的源码,所以还有不少新功能没有在源码中展现出来,如setRequiresBatteryNotLow(设置Job对电量的要求)、setRequiresStorageNotLow(设置Job对存储空间的要求)等,你们有兴趣能够本身去了解一下。 后续,我会从源码角度分析JobScheduler的工做原理。ui

相关文章
相关标签/搜索