Как JobSchedule сохраняет рабочие места? Когда я должен перенести их? - PullRequest
0 голосов
/ 25 июня 2018

В настоящее время я работаю над приложением, которое требует, чтобы определенное задание выполнялось в очень определенное время, независимо от того, что происходит - устройство перезагружается, изменяется местное время, приложение обновляется и так далее. Это время выбирается с сервера в секундах. Итак, когда я получаю это значение, я создаю работу с кодом, подобным этому

ComponentName componentName = new ComponentName(context, MyJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(jobId, componentName);
builder.setMinimumLatency(secondsFromApi * 1000);
builder.setOverrideDeadline(secondsFromApi * 1000);
builder.setPersisted(true);
JobScheduler scheduler = context.getSystemService(JobScheduler.class);
scheduler.schedule(builder.build());

Все работает нормально, даже когда я перезагружаю устройство, задание запускается в ожидаемое время. Тем не менее, все становится грязно, когда я вручную изменяю время устройства перед перезагрузкой. Представьте себе ситуацию, которая, я скажу, создала задание для запуска за 120 секунд, затем я перешел к настройкам устройства, изменил время до нескольких часов и выключил устройство. Затем я подождал некоторое время, которое превышает 120 секунд, чтобы сделать состояние еще более экстремальным, и я включил устройство. К сожалению, работа не будет работать. Если я не изменил время и перезапустил телефон, подождал 5 минут и снова включил его, задание сработало бы примерно через минуту после загрузки, наиболее вероятно, когда операционная система завершит свои обязательные действия и приступит к выполнению отложенных заданий. и находит мой и выполняет его.

Следуя логике предыдущего примера, я предполагаю, что JobScheduler фактически не ведет обратный отсчет таймера, пока устройство находится в автономном режиме. Скорее, когда я пытаюсь завершить работу, он, скорее всего, посчитает, сколько осталось миллисекунд для запуска задания, запишет время перезапуска устройства и сохранит это значение. Когда я перезагружаю устройство, оно выбирает текущее время, добавляет оставшиеся миллисекунды и перепланирует задание. В этом случае, если время устройства становится отличным от времени, когда задание было изначально запланировано, то после перезапуска задание будет запускаться слишком поздно (если время было изменено в обратном направлении) или слишком рано (если время было изменено на будущее). ).

Итак, подведем итог: есть несколько вопросов, которые возникли из моих заблуждений

  1. Правильна ли моя логика?
  2. Если да, значит ли это, что я должен создать загрузочный прослушиватель и повторно получить секунд от API после перезагрузки устройства, чтобы убедиться, что работа будет стрелять в нужное время независимо от того, как пользователь меняет часы?
  3. Есть ли другие случаи, когда я должен делать перепланирование? я заметил в некоторых темах, что когда приложение обновляется, задания отбрасываются. Так что, скорее всего, мне нужно сделать перенос в этом случае также? Есть ли другие причины, по которым мне нужно было бы изменить расписание?
...