android JobScheduler 使用和分析

来源:互联网 发布:国家针对大数据的规划 编辑:程序博客网 时间:2024/05/17 03:05

使用:

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


0 0
原创粉丝点击