使用:
一,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.