2012-03-19 81 views
7

我有處理稱爲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

回答

15

你可以叫您的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

相關問題