Jobscheduler API android L

4

我正在制作一个应用程序,利用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)后,它完美地工作。我不确定我做错了什么。


1
也许作业调度程序没有按照您的方式组合这些条件?像是使用OR而不是AND。或者他们可能忘记了这样的边角情况。文档对这些条件的行为并不清楚。 - zapl
如果您使用builder.setMinimumLatency(5000)和builder.setOverrideDeadline(60000),并考虑条件(我使用wifi条件进行了测试),它可以正常工作,因此setPeriodic方法可能有一些特殊的东西告诉它忽略约束。 - gaurav jain
1个回答

4
为了在调度程序上安排新的工作,框架会创建一个新的JobStatus来标识每个内部工作。 JobStatus 的首要任务之一是检查您的工作是否具有定期更新间隔。如果有,则使用定期更新间隔来确定必须运行作业的最新未来时间点,或者换句话说,是否存在截止日期限制。 请注意保留HTML标签。

一个工作被认为准备好执行的标准之一是,它的所有限制条件已经得到满足或者工作的截止日期已过。有关更多信息,请参见JobStatus.isReady

JobSchedulerService添加了几个StateController,用于跟踪作业应该何时运行以及必须停止的时间。其中一个控制器是TimeController,它:

为下一个过期的工作设置闹钟,并确定是否满足了工作的最小延迟

要确定是否应该安排新的警报, TimeController会检查您的作业是否有任何时间延迟或截止日期限制,如果您设置了定期更新间隔,则所有作业似乎都会被赋予这些限制。

我希望这可以帮助您理解为什么尽管存在电池约束,但您的工作仍然继续被安排。但目前我没有一个可以提供直接解决此问题的解决方案。


所以根据我的理解,当它是周期性的时候,没有对任何标准进行检查?我有点困惑。 - android_eng
@Rohit_Ramkumar,对我来说也有一点混乱,但这似乎是源代码所表明的。JobStatus.isReady检查任何限制条件,然后检查截止日期的限制条件。在查看了源代码之后,您不觉得它是这样吗? - adneal
1
完全正确。我现在明白了,但不明白他们为什么这样做。谢谢。 - android_eng
2
已报告此问题。这是链接:https://code.google.com/p/android/issues/detail?id=81265 - android_eng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接