Android JobService的onStartJob方法在调度作业时立即执行

Android JobService的onStartJob方法在调度作业时立即执行,android,android-jobscheduler,firebase-job-dispatcher,Android,Android Jobscheduler,Firebase Job Dispatcher,在android应用程序上工作时,我使用FirebaseJobDispatcher每1分钟运行一次作业 问题 我一运行应用程序,作业就会执行,然后每1分钟执行一次 问题 为什么在计划作业时立即调用onStartJob?为什么不在执行前等待1分钟?我做错了什么 代码 public static void scheduleReminders(Context context) { Driver driver = new GooglePlayDriver(context); Firebas

在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);
}

调度提醒
函数是从主活动的
onCreate
方法调用的。

触发器的源代码包含:

  /**
   * 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.
   */
由于您正在计划定期作业(
.setRecurrential(true)
),因此窗口的开始时间将是自上次运行作业后开始的,如果您从一分钟前开始重新计划作业而未做任何更改,则可能会导致问题,尽管
setReplaceCurrent(true)
应该可以避免此问题

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


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

AFAICT,
executionWindow()
只是一个提示。基于驱动程序使用的基础引擎可能不支持所有可能的值。