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

Задний план

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

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

Проблема

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

Вопросы

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

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

  2. Кажется, что, хотя я использовал «setPersisted (true)» для повторной задачи, когда я перезапускаю устройство, задача не будет вызываться снова. Как так? EDIT: это потому, что я пропустил разрешение 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. Они говорят ( здесь ), что каждая задача имеет wakelock до 3 минут. Что делать, если задача требует больше? Должен ли он приобрести для себя еще один вакелон? Будет ли API предупреждать о выпуске wakelock? Вот что говорят документы:

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

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

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

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

Solutions Collecting From Web of "Некоторые вопросы о GcmTaskService"

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

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

На ответы, на которые нет ответа

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

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

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

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

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

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

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

    В описании javadoc указано значение по умолчанию.

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

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

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

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

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

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

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

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

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

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

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

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

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

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