JobService 的 onStartJob 方法在计划作业后立即执行



在Android应用程序上工作,我使用FirebaseJobDispatcher每1分钟运行一次作业。

问题

一旦我运行应用程序,作业就会执行,然后每 1 分钟执行一次。

问题

为什么在计划作业时立即调用onStartJob?为什么不等 1 分钟再执行?我做错了什么?

法典

public static void scheduleReminders(Context context) {
   Driver driver = new GooglePlayDriver(context);
   FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
   Job job = dispatcher.newJobBuilder()
                    .setService(ReminderJobService.class)
                    .setTag(JOB_TAG)
                    .setConstraints(Constraint.ON_ANY_NETWORK)
                    .setLifetime(Lifetime.FOREVER)
                    .setRecurring(true)
                    .setReplaceCurrent(true)
                    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                    .setTrigger(Trigger.executionWindow(60, 65))
                    .build();
   dispatcher.mustSchedule(job);
}

scheduleReminders函数是从主活动onCreate方法调用的。

Trigger的源代码包含:

  /**
   * Creates a new ExecutionWindow based on the provided time interval.
   *
   * @param windowStart The earliest time (in seconds) the job should be considered eligible to run.
   *     Calculated from when the job was scheduled (for new jobs) or last run (for recurring jobs).
   * @param windowEnd The latest time (in seconds) the job should be run in an ideal world.
   *     Calculated in the same way as {@code windowStart}.
   * @throws IllegalArgumentException if the provided parameters are too restrictive.
   */

由于您正在计划定期作业 ( .setRecurring(true) ),窗口开始时间将是上次运行作业以来的时间,如果您从一分钟前重新计划作业而没有更改,这可能会导致问题,尽管setReplaceCurrent(true)应该避免此问题。

更可能的原因(如@CommonsWare所说)是这些触发器并不完全准确,它们是您希望操作系统安排作业的时间,而不是实际运行时。上面评论中的in an ideal world短语是关键!

增加在正确时间执行的可能性的一种方法是增加操作系统的机会窗口,例如50秒和100秒,而不是60秒和65秒。或者,如果您在确切的时间需要某些东西,也许警报是更好的方法。

相关内容

  • 没有找到相关文章

最新更新