Я пытаюсь использовать GCM Network Manager для отправки журналов на серверную службу. Примерно каждый час у нас срабатывает будильник, который создает OneoffTask, который при выполнении вызывает серверную службу с сообщением журнала.
Это работает, НО очень большое количество задач теряется (более половины). Сначала я подумал, что это как-то связано с нашим бэкэндом или с сетью, но после добавления тонны журналирования файлов оказалось, что onRunTask в службе никогда не запускается для этих задач (но они определенно планируются). Почему они потеряны?Я неправильно понимаю API, или OneoffTasks просто не надежен?
Вот как планируется OneoffTask:
GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder()
.setService(AvroLogService.class)
.setExtras(bundle)
// A mandatory tag which identifies the task
// We add a unique hash to the tag to make sure that
// tasks are logged and not thrown away as dupes.
// See: http://stackoverflow.com/q/34528960/304262
.setTag(java.util.UUID.randomUUID().toString())
// Persist to disk, even across boots:
.setPersisted(true)
// Sets a time frame for the execution of this task in seconds.
// This specifically means that the task can either be
// executed right now, or at latest at a certain point:
.setExecutionWindow(0, TWO_WEEKS_IN_SECONDS)
.build());
Опять же не это работает, а только часть сообщений. Для сообщений, которые впоследствии были потеряны, приведенный выше код определенно выполняется (я добавил ведение журнала файлов, чтобы убедиться в этом), но для потерянных сообщений никогда не запускается соответствующий onRunTask.
Я убедился, что:
- Манифест обновляется в соответствии с Руководством по внедрению Network Manager (https://developers.google.com/cloud-messaging/network-manager)
- AvroLogService (мой сервис) расширяет GcmTaskService
- Он переопределяет onRunTask
- Приложение имеет разрешение RECEIVE_BOOT_COMPLETED.
- AvroLogService НЕ переопределяет onStartCommand.
Я потерялся. Может ли кто-нибудь поделиться информацией об этом?