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.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值