我正在制作一个使用 jobscheduler API 的应用程序。
我想定期以及在设备充电时运行服务。这是代码。
JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
builder.setPeriodic(3000);
builder.setRequiresCharging(true);
mTestService.scheduleJob(builder.build());
现在,当我运行此命令并拔掉设备时,该服务在 3 秒后仍然运行。设置 setRequiresCharging 没有任何效果。
当我注释掉 builder.setPeriodic(3000) 时,它工作得很好。我不确定我哪里出错了。
为了在内部识别每项工作,该框架创建了一个新的JobStatus https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/JobStatus.java当新作业进入调度程序时。首先要做的事情之一JobStatus
所做的就是检查你的作业是否有定期更新间隔。如果是这样,它会使用周期性更新间隔 https://github.com/android/platform_frameworks_base/blob/lollipop-release/core/java/android/app/job/JobInfo.java#L167确定将来必须运行作业的最新时间点,或者换句话说,如果有期限限制。 https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/JobStatus.java#L177
考虑工作的标准之一准备被执行 https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/JobSchedulerService.java#L634,它的所有约束都已满足or工作的截止日期已过。看JobStatus.isReady https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/JobStatus.java#L201了解更多信息。
The JobSchedulerService
添加了几个StateControllers https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/StateController.java用于跟踪作业何时应运行以及何时必须停止。这些控制器之一是TimeController https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/TimeController.java, which:
为下一个到期作业设置警报,并确定是否
已满足作业的最小延迟
确定是否应安排新的警报 https://github.com/android/platform_frameworks_base/blob/lollipop-release/services/core/java/com/android/server/job/controllers/TimeController.java#L91, TimeController
检查您的作业是否有任何时间延迟或截止日期限制,如果您设置定期更新间隔,则所有作业似乎都会给出这些限制。
我希望至少能帮助你理解why尽管电池电量有限,您的工作仍会继续按计划进行。但目前我还没有可以直接解决此问题的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)