jul
jul

Reputation: 37484

Listening to bound location service from an activity

I've got a location service to have an updated location in my app. I bind it to every activity requiring location data, and now I'd like to know in these activities when the location listener in the service receives events such as onLocationChanged, onProviderEnabled... How can I do that?

In my activities

private ServiceConnection mConnection;     

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Bind location service
    bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE);

    // Activity stuff...
}

@Override
protected void onDestroy() {
    super.onDestroy(); 
    // Unbind LocationService
    context.unbindService(mConnection);
}

LocationService.java

public class LocationService extends Service implements LocationListener {

    LocationManager locationManager; 

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {        
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){    

            // Update after minimum 5 minutes and if user has moved at least 100 meters.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this);        

            Location loc = getBestLocation(locationManager);
            if(loc!=null){
                GlobalVars.lat = (Double) (loc.getLatitude());
                GlobalVars.lng = (Double) (loc.getLongitude());
            }
        }
    }

    public void onLocationChanged(Location loc) {        
        GlobalVars.lat = (Double) (loc.getLatitude());
        GlobalVars.lng = (Double) (loc.getLongitude()); 
    }

    public static Location getBestLocation(LocationManager locationManager) {

        Location location_gps = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Location location_network = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        // If both are available, get the most recent
        if(location_gps!=null && location_network !=null) {
            return (location_gps.getTime() > location_network.getTime())?location_gps:location_network;
        }
        else if(location_gps==null && location_network ==null){
            return null;
        }
        else
            return (location_gps==null)?location_network:location_gps;

    }

    public void onProviderEnabled(String s){
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 0, this); 
    }
    public void onProviderDisabled(String s){
        locationManager.removeUpdates(this);
        GlobalVars.lat = null;
        GlobalVars.lng = null;  
    }
    public void onStatusChanged(String s, int i, Bundle b){}

    @Override
    public void onDestroy() {       
        locationManager.removeUpdates(this);
    }
}

Upvotes: 2

Views: 1939

Answers (1)

Plamen Nikolov
Plamen Nikolov

Reputation: 4187

I would do it on this way:

  1. Create LocationListener class..
  2. Each time i get a new location, send broadcast message with specific predefined ACTION and in extras put lat and lon.
  3. Each activity creates broadcast listener for this message with intentFilter(Action);
  4. Get extras from the intent.

Upvotes: 1

Related Questions