В дополнение к ответу Мерлина (я просто печатал этот лот в блокноте, когда он появился) - я согласен. Мое предложение:
Столкнувшись с подобной проблемой, я решил, что лучше всего будет отделить весь GPS от основной деятельности с помощью службы.
Под этим я подразумеваю службу, которая выполняет requestsLocationUpdates()
и removeLocationUpdates()
и реализует LocationListener
. Этот сервис предоставляет методы, которые основная деятельность может вызывать с помощью интерфейса IBinder
. Он также отправляет широковещательные сообщения активности, которая реализует BroadcastReceiver
для прослушивания этих сообщений.
Таким образом, один из сервисных методов, которые может вызвать ваша основная деятельность, будет (скажем)
mLocnServ.startGPS(int timeout, float requiredAccuracy, int minUpdatePeriod, int minResendDistance)
где mLocnServ
- интерфейс связующего, предоставляемый службой.
Последние два аргумента - это те, которые передаются в качестве аргументов requestLocationUpdates в сервисе. (лично я не думаю, что это имеет какое-либо значение, когда GPS отключается, насколько я вижу, он работает все время, пока не будет вызван removeUpdates()
). В любом случае, первый аргумент (тайм-аут) должен быть временем, когда вы готовы ждать исправления требуемой точности (аргумент 2).
Таким образом, в вашем сервисе вам понадобится Runnable в качестве таймера, который, если истечет время ожидания, отправит трансляцию типа TIMED_OUT
(скажем) и removeUpdates, чтобы остановить GPS. В onLocationChanged вы можете проверить полученное местоположение с требуемой точностью и, если оно достаточно хорошее, отправить трансляцию типа GOT_A_FIX
(скажем) и передать местоположение (широта / долгота и точность) в качестве дополнений в трансляции, а затем удалить остановить GPS. (TIMED_OUT
и GOT_A_FIX
являются просто примерами имен для перечислений, которые вы можете составить, чтобы различать типы широковещательных сообщений)
Основное действие может решить, что делать затем в его BroadcastReceiver onReceive (), т. Е. Делать ли повторную попытку, если он получил TIMED_OUT
трансляцию, или что делать с данными, полученными из сообщения GOT_A_FIX
.
Вам, вероятно, также понадобится mLocnServ.stopGPS
в переплете, чтобы можно было отключить GPS независимо от того, что делает служба