Метод onStartJob JobService выполняется, как только запланировано задание - PullRequest
0 голосов
/ 25 января 2019

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

0 голосов
/ 25 января 2019

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

...