如何在应用程序closures时禁用Android LocationListener

我有一个类处理名为MyLocationManager.java位置服务

这是代码:

package com.syariati.childzone; import java.util.List; import java.util.Locale; import android.content.Context; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.Toast; public class MyLocationManager { private Context context; private double myLat = 0.0; private double myLon = 0.0; private LocationManager locationManager = null; private Location location = null; private Criteria criteria; private String locationName = null; public MyLocationManager(Context ctx) { this.context = ctx; } private String setCriteria() { this.criteria = new Criteria(); this.criteria.setAccuracy(Criteria.ACCURACY_FINE); this.criteria.setAltitudeRequired(false); this.criteria.setBearingRequired(false); this.criteria.setCostAllowed(true); this.criteria.setPowerRequirement(Criteria.POWER_LOW); return locationManager.getBestProvider(criteria, true); } public double getMyLatitude() { return this.myLat; } public double getMyLongitude() { return this.myLon; } public String getLocation() { return this.locationName; } public void onLocationUpdate() { locationManager = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); String provider = setCriteria(); location = locationManager.getLastKnownLocation(provider); updateWithNewLocation(location); locationManager.requestLocationUpdates(provider, 1000, 0, new MyLocationListener()); } private void updateWithNewLocation(Location location) { if (location != null) { this.myLat = location.getLatitude(); this.myLon = location.getLongitude(); // Toast.makeText(this.context, // "Lokasi Anda:\n" + this.myLat + "\n" + this.myLon, // Toast.LENGTH_LONG).show(); getLocationName(this.myLat, this.myLon); } else { Toast.makeText(this.context, "Lokasi Anda Tidak Diketahui", Toast.LENGTH_SHORT).show(); } } private void getLocationName(double lat, double lon) { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); try { List<Address> adresses = geocoder.getFromLocation(lat, lon, 1); StringBuilder sb = new StringBuilder(); if (adresses.size() > 0) { Address address = adresses.get(0); for (int i = 0; i < address.getMaxAddressLineIndex(); i++) sb.append(address.getAddressLine(i)).append("\n"); sb.append(address.getCountryName()).append("\n"); } this.locationName = sb.toString(); // Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location newLocation) { // TODO Auto-generated method stub myLat = newLocation.getLatitude(); myLon = newLocation.getLongitude(); getLocationName(myLat, myLon); Toast.makeText(context, "Lokasi terupdate\nLat: " + myLat + "\nLon: " + myLon, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String arg0) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub } } } 

它有一个实现了位置侦听器的Inner类。 到目前为止,它的工作。 它听的位置没有问题。 但是,当我退出我的应用程序,它不会完全停止听的位置。 正如你从这个代码看到的:

 @Override public void onLocationChanged(Location newLocation) { // TODO Auto-generated method stub myLat = newLocation.getLatitude(); myLon = newLocation.getLongitude(); getLocationName(myLat, myLon); Toast.makeText(context, "Lokasi terupdate\nLat: " + myLat + "\nLon: " + myLon, Toast.LENGTH_SHORT).show(); } 

当位置更新时,将显示吐司,并且在位置更新时仍然显示。 即使我closures了应用程序。

如何在我的情况下完全停止位置监听器。

这一个帮助我停止更新:

android如何停止gps

Solutions Collecting From Web of "如何在应用程序closures时禁用Android LocationListener"

您可以在您的LocationManager上调用removeUpdates。

public void removeUpdates(PendingIntent intent)

使用给定的PendingIntent删除当前活动的当前注册。 在这个调用之后,更新将不再发生这个意图。

参数:

intent {#link PendingIntent}对象不再需要位置更新

抛出:

IllegalArgumentException如果intent为null

看到这里: http : //developer.android.com/reference/android/location/LocationManager.html#removeUpdates(android.app.PendingIntent)

更新:

在这种情况下,你可以改变这一行:

 locationManager.requestLocationUpdates(provider, 1000, 0, new MyLocationListener()); 

至:

 MyLocationListener myLL = new MyLocationListener(); locationManager.requestLocationUpdates(provider, 1000, 0, myLL); 

当你想删除你的监听器调用如下:

 locationManager.removeUpdates(myLL);