天天看點

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.