【问题标题】:Jobscheduler API android L作业调度器 API android L
【发布时间】:2014-11-30 00:37:43
【问题描述】:

我正在制作一个使用作业调度程序 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) 时,它工作得非常好。我不确定我哪里出错了。

【问题讨论】:

  • 也许作业调度程序没有像您那样结合这些条件?喜欢 OR 而不是 AND。或者,也许他们忘记了这样的角落。文档不清楚这些条件的行为。
  • 如果你使用 builder.setMinimumLatency(5000) 和 builder.setOverrideDeadline(60000),它会考虑条件(我用 wifi 条件测试),所以也许 setPeriodic 方法有什么特别之处可以告诉它忽略约束。

标签: android android-5.0-lollipop android-jobscheduler


【解决方案1】:

为了在内部识别每个作业,框架会在新作业到达调度程序时创建一个新的JobStatusJobStatus 所做的第一件事就是检查您的工作是否有定期更新间隔。如果是,它使用periodic update interval 来确定将来必须运行作业的最新点,或者换句话说,if it has a deadline constraint.

一项工作被视为ready to be executed 的标准之一是满足其所有约束工作的截止日期已过期。有关更多信息,请参阅JobStatus.isReady

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

为下一个即将到期的作业设置警报,并确定是否有 已满足作业的最小延迟

To determine if a new alarm should be scheduledTimeController 检查您的工作是否有任何时间延迟或截止日期限制,如果您设置了定期更新间隔,所有工作似乎都会得到这些限制。

我希望这至少可以帮助您了解为什么尽管您的电池受限,您的工作仍会继续被安排。但我目前没有可以直接解决此问题的解决方案。

【讨论】:

  • 所以据我了解,没有定期检查任何标准吗?我有点困惑。
  • @Rohit_Ramkumar 这对我来说也有点令人困惑,但这似乎是消息来源所表明的。 JobStatus.isReady 检查任何约束,然后检查截止日期约束。查看源代码后,您觉得不是这样吗?
  • 当然。现在我明白了,但不明白他们为什么这样做。谢谢。
  • 报告了这个问题。这是链接code.google.com/p/android/issues/detail?id=81265
猜你喜欢
  • 1970-01-01
  • 2018-07-09
  • 2020-07-02
  • 1970-01-01
  • 2017-06-18
  • 2019-10-03
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多