7

I have a class which handle a location service called MyLocationManager.java

this is the code :

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
        }

    }

}

which has an Inner class that implements location listener on it. So far, it works. It listen the location with no problem. However, when I exit my apps, it doesn't completely stop the listen the location. As you see from this code :

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

while the location is updated, the toast will be shown, and it still appear when the location is updated. Even when I've closed the application.

How to stop the location listener completely in my case.

This one helped me to stop the updat :

android how to stop gps

Community
  • 1
  • 1
farissyariati
  • 365
  • 4
  • 9
  • 21

1 Answers1

15

You may call removeUpdates on your LocationManager.

public void removeUpdates (PendingIntent intent)

Removes any current registration for location updates of the current activity with the given PendingIntent. Following this call, updates will no longer occur for this intent.

Parameters:

intent {#link PendingIntent} object that no longer needs location updates

Throws:

IllegalArgumentException if intent is null

See here: http://developer.android.com/reference/android/location/LocationManager.html#removeUpdates(android.app.PendingIntent)

Updated:

In this case, you may change this line:

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

to:

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

When you want to remove your listener call as below:

locationManager.removeUpdates(myLL);
Community
  • 1
  • 1
PhatHV
  • 8,010
  • 6
  • 31
  • 40