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

Задний план

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

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

Проблема

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

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

Вопросы

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

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

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

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

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

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

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

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

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

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

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


person android developer    schedule 09.06.2016    source источник
comment
привет, я использовал эту библиотеку в течение нескольких дней, для # 2 она повторяется для меня, но, похоже, она не учитывает числа, указанные в окне выполнения.   -  person eriuzo    schedule 10.06.2016
comment
@eruzo Как это повторяется с тобой? каждые сколько секунд/минут? Как вы заставили это работать?   -  person android developer    schedule 10.06.2016
comment
@op я не записал числа в первый раз, дайте мне записать это, может быть, я опубликую ответ завтра   -  person eriuzo    schedule 13.06.2016
comment
У меня такая же проблема. Особенно эта функция не очень хорошо объясняется в документации Google. Но эта ссылка developer.android.com/topic/performance/scheduling.html#af было здорово для меня. Вы смотрели этот документ раньше? Теперь я понимаю, почему Google Firebase.JobSchedule   -  person Rafael Pacheco    schedule 24.08.2016


Ответы (1)


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

<сильный>1. Может ли задание иметь параметры, которые остаются с ним и даже могут быть изменены при необходимости? В образце говорится: «Необязательный пакет дополнительных функций, предоставляемых пользователем. По умолчанию используется пустой пакет». . Это все? Может ли он быть изменен заданием после его выполнения?

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

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

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

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

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

<сильный>7. Будет ли удалена работа при удалении данных в приложении?

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

<сильный>8. Можно ли сообщить заданию, что лучше всего выполнять его в определенное время (например, между 7:00 и 8:00 утра)? Упоминается «ExecutionWindowTrigger — указывает временное окно, в котором должно выполняться задание». Это оно? Что произойдет, если он пропустит это окно?

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

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

<сильный>9. Метод «onStartJob» в классе «JobService» возвращает логическое значение, и его описание — «есть ли еще работа». . Что это означает? Что означает параметр «needsReschedule» метода «jobFinished»? Связаны ли они друг с другом?

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

если onStartJob возвращает true, это означает, что вы запустили поток и ожидаете результатов. Как только вы закончите, вы должны вызвать jobFinished, чтобы сообщить службам Google Play, следует ли перенести задание или нет. Если да, задание будет перенесено в зависимости от RetryStrategy.

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

    • onStartJob should offload work to another thread of execution as soon as possible. They provide a SimpleJobService as an example of what is expected from you.
    • Для Lollipop JobScheduler нет реализации драйвера. Также необходимо обработать ситуацию, когда сервисы Google Play недоступны, нам, вероятно, следует реализовать Driver на основе AlarmManager.
person Flavio    schedule 09.09.2016
comment
Спасибо тебе за это. К сожалению, я давно оставил этот вопрос. Я дам вам голос за усилия, но, поскольку я не знаю, насколько он хорош, я все равно не буду отмечать его как принятый. Может быть, однажды я вернусь к нему снова и отмечу. - person android developer; 10.09.2016
comment
Было бы очень полезно увидеть цитируемый вопрос перед ответом. Теперь приходится прокручивать вверх и вперед. - person azizbekian; 20.02.2017
comment
Существуют ли какие-либо ограничения, о которых мне следует знать? Важно отметить — для большинства вещей Firebase — что клиент Android имеет закрытый исходный код и включает странные зависимости от GPS. Это позволяет Google контролировать его использование и предотвращает запуск вашего приложения на Amazon Android или большинстве устройств Android в Китае. - person Tom; 17.11.2017
comment
блестящий ответ, чтобы очистить многие основные вещи, не могли бы вы помочь мне с моим вопросом устройства">здесь - person shashank chandak; 10.11.2018