如何禁用的Android LocationListener的,当应用程序被关闭

问题描述:

我有处理称为MyLocationManager.java如何禁用的Android LocationListener的,当应用程序被关闭

位置服务,这是代码的类:

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 
     } 

    } 

} 

其具有实现位置监听器的内部类在上面。到目前为止,它的工作。它听取位置没有问题。但是,当我退出我的应用程序时,它不会完全停止侦听位置。当你从这个代码中看到:

@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(); 
      } 

而位置更新,面包将显示,当位置更新它仍然会出现。即使我已经关闭了应用程序。

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

这一个让我停止updat:

android how to stop gps

你可以叫您的LocationManager removeUpdates。

公共无效removeUpdates(的PendingIntent意图)

删除与给定的PendingIntent当前 活性的位置更新任何当前注册。在此通话之后,更新 将不再发生此意图。

参数:

意图{#LINK的PendingIntent}对象不再需要位置 更新

抛出:

IllegalArgumentException - 如果意图是空

在这里看到: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); 
+0

你有什么例子吗? – farissyariati 2012-03-19 02:45:30

+0

我更新了我的答案。 – PhatHV 2012-03-19 03:03:35

+0

谢谢。它解决了我的问题:) – farissyariati 2012-03-19 03:26:53