ericlee
ericlee

Reputation: 2753

Custom Android LocationListener Questions

Currently i have the coding as below for use on my activity on android. Right now i use this as an object and start scanning location and get back it's location using returnBestLocation method 3seconds later using a handler.

However i would like to ask is there any possibility that MyLocationListener object will automatically return call the activity on location change instead of calling the object to retrtive location 3s later?

public class MyLocationListener implements LocationListener {

    LocationManager locationManager;
    Date currentBestLocationDate;
    Intent notificationIntent;
     Context mContext;
    Location currentBestLocation = null, lastKnownLocation=null;

 public MyLocationListener(Context mContext)
 {this.mContext = mContext;

 }


 public void startLocationScan()
 {
     Log.d(Config.log_id, "Custom Location Listener started");

     if (locationManager == null) {

        locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        Location locationNETWORK = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        if (locationNETWORK != null) {
            lastKnownLocation=locationNETWORK;
        }
        Location locationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (locationGPS != null) {
            lastKnownLocation=locationGPS;

        }
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,  MyLocationListener.this);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,MyLocationListener.this);





    }


 }
 public void stopLocationScan()
 {

        if(locationManager!=null)
        {
            locationManager.removeUpdates(MyLocationListener.this);

             Log.d(Config.log_id, "Custom Location Listener Stopped");
        }
        }
public Location returnBestLocation()
{
    return currentBestLocation;
}

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onLocationChanged(Location location) {


        // TODO Auto-generated method stub
        if (currentBestLocation == null) {
            currentBestLocation = location;
        }

        long timeDelta = location.getTime() - currentBestLocation.getTime();
        Log.d(Config.log_id, "locationpostingservice's changed with accuracy " + location.getAccuracy() + " s different " + (float) timeDelta / 1000);

        if (timeDelta >= 120000) {
            currentBestLocation = location;
            Log.d(Config.log_id,"posting service Location changed due to over 2min "+ location.getAccuracy() + " s different "+ (float) timeDelta / 1000);

        }


        if (currentBestLocation.getAccuracy() >= location.getAccuracy()) {
            currentBestLocation = location;
        }

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

Upvotes: 2

Views: 964

Answers (2)

Teasel
Teasel

Reputation: 960

The proper way to do this is, as Fraggle says, to create your own listener interface, implement it in your class, then call your listener from your Activity.

But a quick-n-dirty alternative could be to just implement the LocationListener interface in your Activity, rather than spinning it off into a new class (MyLocationListener). Then just put all the code you want to run into onLocationChanged, and don't worry about communicating with other objects.

Upvotes: 0

Fraggle
Fraggle

Reputation: 8727

You could pass the Activity you want to be notified to MyLocationListener as a Listener. Create your own Listener interface, let the Activity implement it and add a method to MyLocationListener like addListener(). Every time you want to notify those activities iterate through the list of Listeners and call their locationChanged method (or whatever you called it in your interface definition). Just be sure to add error handling for null listener Activities, etc.

So basically you have your own custom Listeners listening to a LocationListener.

Another way would be to use Broadcast Receivers and broadcast the location change.

Upvotes: 4

Related Questions