Как составить заявку на обновление местоположения в Android от сервиса - PullRequest
0 голосов
/ 14 марта 2012

этот сценарий очень распространен в соответствии с документацией Android, но все же я не нахожу прямого решения ни там, ни где-либо в сети.Поэтому у меня есть служба, которая должна делать что-то вроде этого:

  1. Зарегистрировать LocationListener для получения местоположения пользователя
  2. После вызова LocationListener - прекратить прослушивание на 5 минут
  3. Через 5 минут снова начните прослушивание и выполните цикл с 1

Это рекомендуемый способ экономии заряда аккумулятора при прослушивании местоположения пользователя.

В качестве услуги у меня естьОсновная проблема с шагом 3. Единственный способ, которым я нашел «ждать» в течение 5 минут, - это запланировать java.util.Timer для выполнения TimerTask за 5 минут, и эта TimerTask должна снова зарегистрировать LocationListneres.Однако это не работает из-за: java.lang.RuntimeException: Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () , что также ожидается, поскольку requestLocationUpdates должен вызываться из "main"Тема.

Хорошо ... хорошо ... но у меня нет главной темы.У меня нет активности.Из TimerTask я не могу отправить намерение в службу, чтобы зарегистрировать моих слушателей обратно.

Как я могу попросить мою собственную службу снова зарегистрировать моих слушателей?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Это рекомендуемый способ экономии заряда аккумулятора при прослушивании местоположения пользователя.

Действительно?Единственный способ получить хороший шаблон - это использовать AlarmManager для пятиминутной задержки, чтобы устройство засыпало между проверками местоположения.

Единственный способ, которым я обнаружил, - «ждать»на 5 минут запланировать java.util.Timer для выполнения TimerTask за 5 минут, и эта TimerTask должна снова зарегистрировать LocationListneres.

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

У меня нет главного потока

Да, вы делаете,Все процессы имеют основной поток приложений.onCreate(), onStartCommand() и т. Д. Службы вызываются в главном потоке приложений.

У меня нет активности.

Тогда вам лучшенапишите один, так как ваше приложение не будет работать на Android 3.1+ без него.Ваше приложение не будет работать до тех пор, пока пользователь не запустит одно из ваших действий на Android 3.1 +.

Как я могу попросить свою собственную службу снова зарегистрировать моих слушателей?

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

Я написал LocationPoller для обработки вашего варианта использования, и другой разработчик разработал его для создания более многофункциональной реализации .

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

0 голосов
/ 22 июля 2013

Вы можете указать параметр в requeestLocationUpdates(), чтобы запустить его через определенное время.

...