使用:
一,app要写一个service继承自 JobService 并实现
@Override public boolean onStartJob(JobParameters params) { return false; }
@Overridepublicboolean onStopJob(JobParameters params) {returnfalse; }
二,得到 JOB_SCHEDULER_SERVICE
mJobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE );
三,生成jobinfo:
JobInfo.Builder builder = new JobInfo.Builder( 1,
new ComponentName( getPackageName(),
JobSchedulerService.class.getName() ) );
这里的JobSchedulerService是第一步里创建的类.
四,设置其它一些属性.根据需求来写.
五,最后把这个jobinfo发给fw处理:
if( mJobScheduler.schedule( builder.build() ) <= 0 ) { //If something goes wrong}
原理分析:
从JobSchedulerService.JobSchedulerStub.schedule开始.
走到JobSchedulerService.scheduleAsPackage.在这个里面创建JobStatus对象
三,调用 JobSchedulerService.startTrackingJob.把这个jobstatus放入mJobs里.
四,然后根据这个JobStatus.找到对应的controller.并调用controller的maybeStartTrackingJobLocked
五,controller的事件满足后,会促发回调.走到onControllerStateChanged onRunJobNow onDeviceIdleStateChanged等这几个回调
六,直接看看 JobSchedulerService.onRunJobNow.这个会发出MSG_JOB_EXPIRED消息.
七.这个消息会对job做一些处理.比如加入pending队列什么的.
八,调用JobSchedulerService.JobHandler.maybeRunPendingJobsH.这个里面会去找一个JobServiceContext来处理可以执行的jobstatus.
也就是通过final Intent intent = new Intent().setComponent(job.getServiceComponent());
boolean binding = mContext.bindServiceAsUser(intent, this,
Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,
new UserHandle(job.getUserId()));
来调用前面应用端写的service.