Прежде всего, ваш LocationListener не должен быть частью деятельности.Действия имеют четко определенный жизненный цикл и могут создаваться и разрушаться платформой Android по мере необходимости.Поэтому переменные экземпляра вашей Деятельности необходимо будет повторно инициализировать в методе onResume () вашей активности, что сделает их совершенно непригодными для длительного хранения.
Итак.Начните с создания липкой службы для управления запуском и остановкой обновлений местоположения.Прилипание означает, что экземпляр службы зависает между вызовами, и поэтому вы можете надежно использовать переменные экземпляра и знать, что они будут сохранять свои значения до тех пор, пока служба не будет прервана.Эта служба также должна реализовывать интерфейс LocationListener, и теперь она может хранить местоположение, уведомленное об этом при вызове onLocationChanged:
public class LocationService extends Service implements LocationListener {
private LocationManager locationManager;
private Location location;
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
Logging.i(CLAZZ, "onHandleIntent", "invoked");
if (intent.getAction().equals("startListening")) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
else {
if (intent.getAction().equals("stopListening")) {
locationManager.removeUpdates(this);
locationManager = null;
}
}
return START_STICKY;
}
@Override
public IBinder onBind(final Intent intent) {
return null;
}
public void onLocationChanged(final Location location) {
this.location = location;
// TODO this is where you'd do something like context.sendBroadcast()
}
public void onProviderDisabled(final String provider) {
}
public void onProviderEnabled(final String provider) {
}
public void onStatusChanged(final String arg0, final int arg1, final Bundle arg2) {
}
}
Теперь у вас есть служба, которую вы можете запускать и останавливать обновления местоположения по мере необходимости.,Это также позволяет вам продолжать получать и обрабатывать изменения местоположения, даже если ваше приложение находится не на переднем плане, если это именно то, что вам нужно.
Теперь у вас есть два способа сделать эту информацию о местоположении доступной: Использоватьcontext.sendBroadcast () для распространения нового Location для (например) действия или использования подхода связанной службы, чтобы позволить другим классам вызывать открытый API и получать Location.См. http://developer.android.com/guide/topics/fundamentals/bound-services.html для получения дополнительной информации о создании связанной службы.
Обратите внимание, что существует множество других аспектов прослушивания обновлений местоположения, которые я здесь не включил, для ясности.