Некоторые вопросы о GcmTaskService

Фон

Я хотел использовать новый API JobScheduler, который был представлен на Lollipop, но, к сожалению, у него нет официального порта для предварительной Lollipop.

Тем не менее, есть GcmTaskService, который предоставляет очень похожие функции.

Эта проблема

Этот API довольно новый, поэтому очень мало мест, где можно найти информацию о том, как его использовать (например, здесь и здесь).

Вопросы

У меня есть несколько вопросов об этом новом API:

  1. Похоже, что он требует использования Google Play Services ( здесь) (кроме случаев использования Lollipop-версии Android, которая будет использовать обычный JobScheduler). Что делать, если сервисы Google Play недоступны?

  2. Кажется, что хотя я и использовал "setPersisted(true)" для повторяющейся задачи, при перезапуске устройства эта задача больше не вызывается. Как так? РЕДАКТИРОВАТЬ: это потому, что я пропустил разрешение RECEIVE_BOOT_COMPLETED .

  3. Каково поведение задачи по умолчанию, если я не использую setRequiredNetwork? Это "NETWORK_STATE_ANY"?

  4. Документы говорят о том, что возвращается из onRunTask, я могу вернуть любое из значений "RESULT_FAILURE", "RESULT_RESCHEDULE", "RESULT_SUCCESS" (информация здесь). Похоже, что опции FAILURE и SUCCESS будут делать одно и то же - удалять задачу из очереди. Это правда? Если так, то в чем именно разница между ними? Они функционируют по-другому?

  5. Используются ли " TaskParams " только для тега задачи? Можно ли как-то передать пакет в задачу с помощью API? В противном случае мне нужно было бы установить БД для хранения того, что должно быть передано задачам, верно?

  6. Возможно ли, чтобы приложение получило очередь задач? Я знаю, что это возможно с помощью ADB, но возможно ли это с помощью API тоже?

  7. Говорят ( здесь), что каждое задание имеет бодрствование до 3 минут. Что нужно сделать, если задача требует большего? Должен ли он приобрести еще один Wakelock для себя? Будет ли API предупреждать, что был выпущен wakelock? Вот что говорят доктора:

Планировщик будет удерживать PowerManager.WakeLock для вашей службы, однако после трех минут выполнения, если ваша задача не вернулась, будет считаться, что время истекло, и блокировка активируется. Перепланирование вашей задачи на данный момент не будет иметь никакого эффекта. Если вы подозреваете, что ваша задача будет выполняться дольше, вам следует явно запустить собственный сервис или использовать какой-либо другой механизм; Этот API предназначен для относительно быстрых сетевых операций.

  1. Они говорят ( здесь), что все сетевые задачи удаляются каждый раз, когда приложение обновляется / заменяется, и при этом происходит вызов "onInitializeTasks", и что вы можете перепланировать их снова. Как я могу перепланировать задачи? Я не думаю, что я могу даже получить список задач...

  2. Можно ли сказать, что задание предпочитает определенное время в течение дня? Например, между 14:00-15:00?

  3. Я заметил, что если вы запланируете задачу, а затем принудительно остановите и / или очистите данные приложения, задача все равно будет запущена. Как я могу избежать этого поведения?

2 ответа

Решение

Вы можете найти ответы на большинство своих вопросов здесь.

https://github.com/jacktech24/gcmnetworkmanager-android-example/blob/master/README.md

На ответы, которые там не ответили

7: Вы не будете получать уведомления при удалении wakelock, и, как говорится в документации, этот API предназначен только для коротких задач, если у вас больше, напишите свою собственную реализацию

9: Нет, вы не можете на данный момент, API не позволяет это

10: Это потому, что сервисы Google Play заботятся об этом, и нет никакого способа обойти это. Вы должны определить в службе, настроено ли приложение (я полагаю, это ваша проблема), например. Конфигурация создается и т. д. и в конечном итоге отменяет все задачи при вызове одной из них.

jacktech24 проделал действительно хорошую работу, но я постараюсь и в случае возникновения каких-либо затяжных вопросов.

  1. Похоже, что он требует использования Google Play Services (здесь) (кроме случаев использования Lollipop-версии Android, которая будет использовать обычный JobScheduler). Что делать, если сервисы Google Play недоступны?*

    Вы не можете использовать этот API, если Сервисы Google Play недоступны. Скорее, клиентская библиотека сервисов Google Play предназначена для того, чтобы запросить пользователя загрузить и установить сервисы Google Play, если он обнаружит, что он отсутствует, но я не верю, что GcmNetworkManager делает это.

  2. Каково поведение задачи по умолчанию, если я не использую setRequiredNetwork? Это "NETWORK_STATE_ANY"?*

    Javadoc описывает, какой по умолчанию.

  3. Документы говорят о том, что возвращается из onRunTask, я могу вернуть любое из значений "RESULT_FAILURE", "RESULT_RESCHEDULE", "RESULT_SUCCESS" (информация здесь). Похоже, что опции FAILURE и SUCCESS будут делать одно и то же - удалять задачу из очереди. Это правда? Если так, то в чем именно разница между ними? Они функционируют по-другому?*

    Единственное различие между этими двумя заключается в том, что в дампсе оболочки adb будет отображаться то, что вы вернули, так что вы можете использовать это для устранения проблем. Другая причина заключается в том, что если задача не выполняется, странно требовать, чтобы клиент вернул "успех".

  4. Используются ли "TaskParams" только для тега задачи? Можно ли как-то передать пакет в задачу с помощью API? В противном случае мне нужно было бы установить БД для хранения того, что должно быть передано задачам, верно?*

    В следующей версии GmsCore должна быть добавлена ​​возможность добавления пакета в задачу.

  5. Возможно ли, чтобы приложение получило очередь задач? Я знаю, что это возможно с помощью ADB, но возможно ли это с помощью API тоже?

    Нет, это невозможно. Вместо этого вы должны выполнить отмену, когда вы этого хотите, и если задача не будет выполнена, то это будет неоперация. Точно так же вы должны запланировать задачу в том месте кода, где вы бы запрашивали список задач. используйте setUpdateCurrent=false, чтобы убедиться, что он не обновляет ранее существовавшую задачу. AlarmManager работает аналогично, так как вы устанавливаете будильник независимо от того, был ли будильник уже установлен - API был разработан, чтобы следовать этому.

  6. Говорят (здесь), что каждое задание имеет бодрствование до 3 минут. Что нужно сделать, если задача требует большего? Должен ли он приобрести еще один Wakelock для себя? Будет ли API предупреждать, что был выпущен wakelock? Вот что говорят доктора: *

    Да, приложение должно приобрести собственный wakelock, и все будет хорошо. Причина, по которой планировщик отпускает блокировку по прошествии 3 минут, заключается в том, что на практике неограниченное время ожидания блокирования приводит к очень трудным отслеживанию ошибок разрядки аккумулятора. Если вам требуется более 3 минут, у вас есть достаточно сложный сценарий использования, в котором вы можете разобраться в том, как работают API-интерфейсы PowerManager, и сами вызывать seek ()/release() (это действительно довольно просто, тот факт, что сетевой менеджер это делает) для вас это скорее вежливость, чем все остальное).

  7. Они говорят (здесь), что все сетевые задачи удаляются каждый раз, когда приложение обновляется / заменяется, и при этом происходит вызов "on InitializeTasks", и что вы можете перепланировать их снова. Как я могу перепланировать задачи? Я не думаю, что я могу даже получить список задач...*

    Вы перепланируете задачи так же, как вы запланировали их в первую очередь. Независимо от того, какую функцию вы использовали для их планирования, вызовите эту функцию из GcmTaskService # on InitializeTasks. Это было сделано для того, чтобы избежать затяжных задач при изменении логики приложения. Рассмотрим ситуацию, когда разработчик меняет расписание своей задачи и начинает использовать другой тег. Они должны будут вызвать метод cancel (old_tag) после того, как они обнаружат обновление (для этого им нужно будет добавить больше кода), что будет означать, что им понадобится ссылка на старый (неиспользованный) тег, даже в их новый код Это будет означать, что тег является стабильным идентификатором, который не должен изменяться при обновлении приложения - что не должно быть требованием для этого API.

  8. Можно ли сказать, что задание предпочитает определенное время в течение дня? Например, между 14:00-15:00?*

    Нет, этот тип фонового планирования вызывает всевозможные проблемы со стадом для большого количества устройств. Т.е., если 1 устройство запускает задание в 15:00, это, вероятно, нормально. Но если 1x10e6 сделать вдруг ваш сервер в серьезных проблем.

  9. Я заметил, что если вы запланируете задачу, а затем принудительно остановите и / или очистите данные приложения, задача все равно будет запущена. Как я могу избежать этого поведения?*

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

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