天天看点

android JobScheduler 使用和分析

使用:

一,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.