2012-03-19 15 views
7

मैं एक वर्ग जो MyLocationManager.javaएंड्रॉयड 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

+0

मैंने अपना जवाब अपडेट किया। – PhatHV

+0

धन्यवाद। यह मेरी समस्या का समाधान :) :) – farissyariati