Использование GoogleAPIClient в фоновых сервисах
Мой сценарий заключается в том, что я хотел бы, чтобы служба периодически получала некоторую информацию (например, местоположение пользователя), сообщала об этом на свой сервер и получала push-уведомление, если местоположение соответствует некоторому X-местоположению.
Я хотел бы получить несколько советов о том, что будет лучшим механизмом для периодического получения информации о местоположении независимо от того, запущено приложение или нет. Вот варианты, о которых я думал, и некоторая справочная информация по каждому из них.
Создание стандартного сервиса Android
Моей первой мыслью было создание службы STICKY, которая инициализирует клиент GoogleAPIClient, который будет получать обновления местоположения, и после получения местоположения он отправляет его на сервер. Проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что мне приходится периодически получать информацию о местоположении. Таким образом, служба будет работать постоянно, даже если не выполняется сканирование местоположения. Кроме того, что было бы лучшим способом опроса местоположения в службе?
Создание тревоги с помощью IntentService
Второй вариант, о котором я подумал, состоял в том, чтобы Alarm Manager проснулся и запустил IntentService, который запускает обновления местоположения (через GoogleAPIClient). Как только местоположение получено, отправьте его на сервер и закройте обновления местоположения. Это решило бы проблему периодического запуска / остановки обновлений местоположения. Однако мне не повезло, подключившись к GoogleAPIClient в IntentService без ожидания, и я не думаю, что это наиболее эффективная вещь.
Создание GcmTaskService
В этом есть много преимуществ AlarmManager и, по-видимому, он более эффективен в режиме ожидания, поскольку он активирует службу только тогда, когда телефон находится в режиме обслуживания, поэтому это кажется хорошим решением. Однако у меня та же проблема, что и у IntentService, который подключается к GoogleAPIClient, чтобы получить местоположение без какого-либо ожидания.
Возможно, я захожу слишком далеко вниз по кроличьей норе, и может быть что-то очевидное, что я упускаю, поэтому любой совет будет с благодарностью.
2 ответа
У меня была такая же проблема. Я пошел на первый подход (липкий сервис), и все работало нормально. Однако мне не понравился тот факт, что сервис всегда работал и был виден пользователю. Вот почему я решил использовать API JobScheduler, так как это предпочтительный способ выполнения фоновой работы в соответствии с документами.
Если ваше приложение предназначено для API>=21, то JobScheduler - это то, что нужно. Если вы хотите поддерживать более старые версии платформы, вам следует использовать недавно представленную библиотеку Firebase JobDispatcher, к которой, к сожалению, не хватает документации.
Все объясняется здесь, на презентации Google I/O 2016. Посмотри на это.
Когда вы запрашиваете обновления, вы можете запросить максимальную частоту. Просто воспользуйтесь услугой и установите максимальную частоту, равную нужному интервалу опроса. Нет AlarmManager необходимо.