2012-03-19 10 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(); 
      } 

場所が更新されている間、トーストが表示されます、そして場所が更新されたとき、それはまだ表示されます。私がアプリケーションを閉じたときでさえ。私の場合には完全に場所のリスナーを停止する方法

この1つはUPDATを停止するために私を助け:

android how to stop gps

答えて

15

あなたのLocationManagerにremoveUpdatesを呼び出すことができます。

公共ボイドremoveUpdates(意図PendingIntent)

与えPendingIntentで現在 活動の位置の更新のための任意の現在の登録を削除します。この呼び出しに続いて、アップデート は、もはやこの目的のために発生しません。

パラメータ:意図がnullの場合

ここで参照

はIllegalArgumentException:もはや位置に 更新

例外を必要

意図{#link PendingIntent}オブジェクト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

+0

私は自分の答えを更新しました。 – PhatHV

+0

ありがとうございます。これは私の問題を解決:) – farissyariati

関連する問題