Android LocationListener оставить включенным, пока телефон спит - PullRequest
1 голос
/ 11 августа 2011

Я установил будильник с флагом RTC_WAKEUP, чтобы каждые 30 секунд запускать IntentService для передачи обновлений местоположения на сервер. Я планирую изменить флаг на RTC, чтобы он не будил телефон, а просто запускался, когда другой процесс будил телефон. Если я оставлю зарегистрированным LocationListener, будет ли он прослушивать обновления местоположения, пока телефон спит?

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

У вас здесь несколько проблем.

Я установил будильник с флагом RTC_WAKEUP, чтобы каждые 30 секунд запускать IntentService для передачи обновлений местоположения на сервер.

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

Во-вторых, пожалуйста, позвольте этой фигуре настраиваться пользователем, включаяопция для "я буду загружать данные вручную, пожалуйста".Как указывает @piotrpo, это приводит к значительному разряду батареи.На самом деле, если вы используете GPS, я сомневаюсь, что батарея будет работать дольше, чем пару часов.

В-третьих, IntentService не будет хорошо работать в этом случае, потому что IntentService закроетсявниз, пока не пришло твое исправление.В лучшем случае вы потеряете память.В худшем случае вы не получите исправления, потому что Android завершает ваш процесс.

Лучшее решение для фоновых проверок местоположения - использовать обычный Service, а не IntentService.Обычная служба регистрирует LocationListener в onStartCommand(), а также организует уведомление о превышении времени ожидания (например, AlarmManager и set()), если исправление недоступно.Когда появится исправление, запустите AsyncTask, чтобы выполнить загрузку.После завершения AsyncTask или по истечении времени ожидания, когда вы не получили исправления, отмените регистрацию слушателя и вызовите stopSelf(), чтобы закрыть службу.Попутно вам нужно будет поддерживать свой собственный WakeLock, чтобы держать устройство в активном состоянии, пока все это происходит.

Пример большей части этого (за исключением части загрузки на сервер) см.my LocationPoller.

Если вы не уверены в том, что это происходит каждые 30 секунд или около того, вы можете вообще не беспокоиться о AlarmManager.Вы должны иметь постоянный сервис, работающий постоянно, с постоянным WakeLock и постоянным LocationListener.Когда исправления появятся в onLocationChanged(), загрузите их, если они более 30 секунд от предыдущего.И обязательно надевайте огнестойкий костюм при выпуске приложения, поскольку тем, кто его запускает, результаты могут не понравиться.

2 голосов
/ 11 августа 2011

Да - служба определения местоположения имеет собственный пробужденный замок. Однако лучший подход - вручную установить правильную блокировку в вашем трансляционном приемнике. Пожалуйста, подумайте об оптимизации - отправка данных по сети каждые 30 секунд разряжает батарею.

...