jobschedule源码如何启动jobService

//使用jobschedule最后会调用下面的提交方法。

jobschedule.schedule(jobInfo)

源码

schedule(jobInfo)这方法是jobSchedule.stud对象的

schedule(jobInfo,uid)这方法是jobschedulerService对象的

startTrackingJob(jobStatus),参数jobStatus其实是jobInfo 和uid的包装类,其构造方法就是这两个参数。后面基本都是对jobstatus对象操作。

这个方法先会判断jobInfo对象是否可以更新(以前是否用过),可以就返回true,不可以就返回false

再遍历mControllers控制器集合,获取控制器对象(这里以获取connectivityController控制器对象为例),

如果jobinfo可以更新就调用maybeStopTrackingJob(jobStatus) ;不能更新调用MaybeStartTrackingJob(JobStatus);

MaybeStartTrackingJob(JobStatus)方法做了些逻辑判断最后把jobStatus放进mTrackedJobs集合里面

 

我们看看connectivityController控制器做了些什么事,它会发个广播来接受系统网络状态变化的广播

onReceiver方法接受广播,变量mTrackedJobs集合 判断uid是否能用,判断广播和我们创建JobInfo设置的广播是否一致,当所以条件满足时,最后实现onControllerChanger接口,

onControllerChanger

jobScheduleService在集合mControllers添加控制器connectivityController时把jobScheduleService传进去了,并且jobScheduleService实现了onControllerChanger接口,当执行者回调方法,说明任务可以执行,jobScheduleService就发送个handle信息,在handlerMessage方法里面做了两件事

1做很多逻辑判断,把最后能执行的jobStatus对象放进mPendings集合里面

2遍历mPendings集合,通过集合里面的jobStatus对获取jobInfo 再获取Component,

使用Intent 把component装进去,再通过context绑定启动service,把intent装进service里面这样就在需要的情况下启动服务。

 

 

 

你可能感兴趣的:(jobschedule源码如何启动jobService)