Метод onStartJob JobService выполняется, как только запланировано задание

Работая над приложением для 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 Метод основной деятельности.

1 ответ

Исходный код 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. В качестве альтернативы, если вам нужно что-то в точное время, возможно, сигнал тревоги является лучший подход.

Другие вопросы по тегам