Подтвердить что ты не робот

Firebase JobDispatcher - как он работает по сравнению с предыдущими API (JobScheduler и GcmTaskService)?

Фон

В Google есть несколько решений для планирования заданий/задач, таких как JobScheduler и GcmTaskService. Каждый из них имеет свои преимущества и недостатки.

Недавно Google представил новую библиотеку под названием "Firebase JobDispatcher".

Проблема

К сожалению, очень мало информации об этом новом API. На самом деле, очень трудно найти что-нибудь об этом.

Единственное, что я нашел, это их объявление и образец. Но даже их, об этом API мало что известно.

Вопросы

Глядя на предыдущие вопросы, исследования и сравнения, которые я имел с другими API (здесь), я хотел бы спросить, как работает новый API и знать, что принимать во внимание при его использовании:

  • Может ли работа иметь параметры, которые остаются с ней и могут даже быть изменены, когда это необходимо? Они говорят в образце "Дополнительный комплект поставляемых пользователем дополнений. По умолчанию используется пустой пакет". Это так? Может ли он быть изменен заданием после его выполнения?

  • Можно ли легко перепланировать задания? Говорят: "Логическое указание, следует ли повторять задание". Как его выбрать, когда нужно перепланировать? Я попробовал образец и выбрал "Повторяющийся", но он, похоже, не запускается снова, только один раз.

  • Могут ли быть защищены от работы с библиотекой (из-за уникальных идентификаторов)?

  • Нужно ли проявлять особую осторожность при обновлении приложения (как это делали предыдущие API)? Могут ли задания по-прежнему планироваться после обновления приложения? Тестирование по образцу, похоже, что задания полностью исчезли после обновления приложения. Можно ли этого избежать?

  • Нужно ли RECEIVE_BOOT_COMPLETED, если я хочу, чтобы задание по-прежнему планировалось, даже когда устройство перезагрузилось? Образец, похоже, имеет его.

  • Можно ли получить список всех запланированных заданий и их информации (включая параметры) и уметь отменять определенные/все из них и даже изменять их?

  • Будет ли удалено задание при работе с ясными данными приложения?

  • Можно ли сказать задание, что он лучше всего будет работать в течение некоторого времени (например: между 7:00 и 8:00 утра)? Он упоминается "ExecutionWindowTrigger", который указывает временное окно, в котором должно выполняться задание ". Это оно? Что происходит, когда он пропускает это окно?

  • Метод onStartJob в классе JobService возвращает логическое значение, а описание для него - "осталось ли больше работы". Что это значит? Что означает параметр needsReschedule метода jobFinished? Связаны ли они друг с другом?

  • Есть ли какие-то ограничения, о которых я должен знать? Например, минимальные и максимальные значения для каждой из функций?

4b9b3361

Ответ 1

На самом деле Firebase Android JobDispatcher - это слой абстракции вокруг механизмов планирования заданий на Android. И пока у них есть только одна реализация драйвера для GCM Network Manager. Это означает, что в настоящее время он ведет себя так же, как ведет себя менеджер GCM Network Manager. Надеюсь, в будущем будет реализовано больше драйверов.

1. Может ли работа иметь параметры, которые остаются с ней и могут даже быть изменены по мере необходимости? Они говорят в образце "Дополнительный комплект поставляемых пользователем дополнений. По умолчанию используется пустой пакет"., Это так? Может ли он быть изменен заданием после его выполнения?

  • Да, Job.Builder имеет метод setExtras с произвольным набором, к которому позже можно получить доступ через jobParameters.getExtras(). Вы не можете изменить пакет (jobParameters содержит только геттеры). Вы можете перенести свою работу с флагом setReplaceCurrent(true) и указать новый пакет.

2. Можно ли легко перепланировать задания? Говорят: "Логическое указание, следует ли повторять задание". Как его выбрать, когда нужно перепланировать? Я попробовал образец и выбрал "Повторяющийся", но он, похоже, не запускается снова, только один раз.

  1. Чтобы перераспределить задание, вам нужно указать setRecurring(true), setTrigger(Trigger.executionWindow(10, 20))

Это активируется, как только крайний срок запуска окна, и водителям предлагается запустить Работу перед окном если возможно.

3. Могут ли они быть защищены от работы с библиотекой (из-за уникальных идентификаторов)?

  1. Тэги тегов должны быть уникальными в вашем приложении. Другие приложения на телефоне имеют свои собственные "конечные точки" (имя пакета/имя службы). Чтобы просмотреть все запланированные/готовые задания для GooglePlayDriver, используйте

    adb shell dumpsys activity service GcmService

4. Требуется ли дополнительная помощь при обновлении приложения (как это делали предыдущие API)? Могут ли задания по-прежнему планироваться после обновления приложения? Тестирование по образцу, похоже, что задания полностью исчезли после обновления приложения. Можно ли этого избежать?

  1. Что касается GCM Network Manager GooglePlayDriver, он не перенаправляет задания после Google Play Services или приложение обновляется. Ниже приведена открытая проблема. Так что пока это ваша ответственность.

5. Нужно ли ему возвращать RECEIVE_BOOT_COMPLETED, если я хочу, чтобы задание еще планировалось, даже когда устройство перезагрузилось? Образец, похоже, имеет его.

  1. Да, вам нужно такое разрешение. Builder имеет параметр для управления поведением: setLifetime(Lifetime.FOREVER | UNTIL_NEXT_BOOT) Конечно, если вы собираетесь создать свой собственный драйвер, вам придется самому позаботиться о жизни.

6. Можно ли получить список всех запланированных заданий и их информации (включая параметры) и уметь отменять определенные/все из них и даже изменять их?

  1. Нет, так же, как для GCM Network Manager. Но вы можете отслеживать все задания самостоятельно, пока планируете их играть в сервисы.

7. Будет ли удалено задание при работе с четкими данными приложения?

  1. Да, работа будет удалена. Вероятно, в предыдущих версиях сервисов google play он вел себя по-другому.

8. Можно ли сказать, что это лучше всего, что он будет работать в течение некоторого времени (например: между 7:00 и 8:00 утра)? Он упоминается "ExecutionWindowTrigger", который указывает временное окно, в котором должно выполняться задание ". Это оно? Что происходит, когда он пропускает это окно?

  1. Ну, вы можете настроить будильник, который будет запущен в 7:00, и запланировать одноразовое задание с помощью executionWindow(0, 60*60). Работа будет работать с 7:00 до 8:00.
    Вы не можете использовать повторяющуюся работу, потому что

    windowStart - самое раннее время (в секундах) задание должно быть считается пригодным для запуска. Рассчитывается с момента назначения задания (для новых заданий) или последнего запуска (для повторяющихся заданий).

Кроме того, ExecutionWindowTrigger указывает приблизительное время. Он не гарантировал, что он будет работать в данном окне. Если он пропустит окно, задание будет выполняться в любое время позже.

9. Метод "onStartJob" в классе "JobService" возвращает логическое значение, а описание для него - "осталось ли больше работы"., Что это значит? Что означает параметр "needsReschedule" метода "jobFinished"? Связаны ли они друг с другом?

  1. if onStartJob возвращает false, что означает, что вы завершили свою работу. Нет необходимости вызывать jobFinished. RESULT_SUCCESS отправляется автоматически.

if onStartJob возвращает true, что означает, что вы начали поток и ожидаете результатов. По мере того как вы закончите, вы должны вызвать jobFinished, чтобы сообщить службам google play о том, должно ли оно быть перенесено или нет. Если да, то задание будет перенесено в зависимости от RetryStrategy.

10. Существуют ли какие-либо ограничения, о которых я должен знать? Например, минимальные и максимальные значения для каждой из функций?

    • onStartJob должен как можно скорее выгрузить работу в другой поток исполнения. Они предоставляют SimpleJobService в качестве примера того, что от вас ожидается.
    • Для Lollipop JobScheduler нет реализации драйвера. Также необходимо обработать ситуацию, когда сервисы google play недоступны, мы должны, вероятно, реализовать Driver на основе AlarmManager.