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

时间:2019-01-25 13:01:16

标签: android android-jobscheduler firebase-job-dispatcher

我正在使用FirebaseJobDispatcher每隔1分钟运行一次作业。

问题

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

问题

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

代码

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方法中调用的。

1 个答案:

答案 0 :(得分:0)

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所说)是这些触发器不是准确无误,它们是您希望OS安排工作的时间,而不是实际时间跑。上方评论中的in an ideal world短语是关键!

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