2016-08-22 2 views
1

Мой сценарий заключается в том, что я хотел бы, чтобы служба периодически получала некоторую информацию (например, местоположение пользователя), сообщала об этом на моем сервере и получала push-уведомление, если местоположение соответствует некоторому местоположению X.Использование GoogleAPIClient в фоновых службах

Я хотел бы получить совет относительно того, что было бы лучшим механизмом для периодического получения информации о местоположении независимо от того, работает ли приложение или нет. Вот варианты, о которых я подумал, и некоторую справочную информацию по каждому из них.

Создание стандартной Android Service

Моя первая мысль была создать КЛЕЙКУЮ службу, которая инициализирует GoogleApiClient, который будет получать обновления местоположения и когда местоположение получен, он будет посылать его на сервер. Проблема с этим подходом заключается в том, что мне приходится периодически получать информацию о местоположении. Таким образом, служба будет работать постоянно, даже если она не запускает сканирование местоположения. И что будет лучшим способом опроса для местоположения так часто в рамках сервиса?

Создание сигнализации с IntentService

Второй вариант я думал только о том, имея поминки Alarm Manager, и запустить IntentService, который начинается геоданных (через GoogleApiClient). После получения местоположения отправьте на сервер и закройте обновления местоположения. Это позволит решить проблему периодического запуска/остановки обновлений местоположения. Однако мне не очень повезло подключиться к GoogleAPIClient в IntentService, не ожидая, и я не думаю, что это самая эффективная вещь.

Создание GcmTaskService

Это имеет много преимуществ AlarmManager и представляется более эффективным с точки зрения спящем режиме, как это только пробуждается службы всякий раз, когда телефон находится в режиме технического обслуживания, так что казалось, хорошее решение. Однако у меня та же проблема, что и IntentService, которая подключается к GoogleAPIClient, чтобы получить местоположение без какого-либо ожидания.

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

ответ

0

У меня была такая же проблема. Я пошел на первый подход (липкий сервис), и все сработало хорошо. Однако мне не понравилось то, что служба всегда работает и видима пользователю. Вот почему я решил использовать API JobScheduler, так как это предпочтительный способ выполнения фоновой работы в соответствии с docs.

Если ваше приложение нацелено на API> = 21, то JobScheduler - это путь. Если вы хотите поддерживать более старые версии платформы, вам следует использовать недавно представленную библиотеку Firebase JobDispatcher, которой, к сожалению, не хватает документации.

Все объяснено here в презентации Google I/O 2016. Взгляните на это.

+0

Я так думал. Как вы связались с подключением к GoogleAPIClient в своем JobScheduler? Использование blockingConnect с тайм-аутом или другим способом? – pkramaric

+0

Я использую метод non-блокировки [connect()] (https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()), а затем я обрабатывать задание в зависимости от результата соединения (методы onConnected, onConnectionFailed). – kws

0

При запросе обновлений вы можете запросить максимальную частоту. Просто используйте сервис и установите максимальную частоту, равную требуемому интервалу опроса. Нет необходимости в AlarmManager.

+0

Я думал об этом, я просто не был уверен, был ли это самый эффективный подход, если максимальная частота будет составлять несколько часов (ее пользователь определил). Я подумал, что, возможно, запуск/остановка FusedLocationApi была более эффективной. – pkramaric

Смежные вопросы