我正在制作一个使用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)时,它的效果非常好。我不确定我哪里出错了。
答案 0 :(得分:4)
为了在内部识别每个作业,当新作业落在调度程序上时,框架会创建一个新的JobStatus
。 JobStatus
做的第一件事就是检查并查看您的作业是否有定期更新间隔。如果是,则使用periodic update interval确定将来必须运行作业的最新点,换句话说,if it has a deadline constraint.
要考虑工作ready to be executed的标准之一,即所有约束都已满足或作业的截止日期已过期。有关详细信息,请参阅JobStatus.isReady
。
JobSchedulerService
添加了几个StateController
s,用于跟踪作业何时运行以及何时必须停止作业。其中一个控制器是TimeController
,其中:
为下一个过期作业设置闹钟,并确定是否为 工作的最小延迟已经满足
To determine if a new alarm should be scheduled,TimeController
检查您的作业是否有任何时间延迟或截止日期限制,如果您设置了定期更新间隔,则似乎会给出所有作业。
我希望这可以帮助您至少理解为什么尽管您的电池限制,您的工作仍在继续安排。但我现在还没有一个解决方案可以直接解决这个问题。