 <p>It appears that your onHandleIntent method is not blocking the thread it is executing on, so it will return quickly and allow the second intent to be processed. Not only that, but any callbacks from the LocationManager to that thread are unlikely to be processed as the background thread is likely to be killed when onHandleIntent is finished.</p> <p>If you really want to use IntentService to manage your intent queue then you will need to do your location handling on its own thread, and join the IntentService thread to the location thread whilst it is waiting for the location callback.</p> <p>Heres a bit of code that demonstrates the idea:</p> <pre><code>public class TestService extends IntentService { private static final String TAG = "TestService"; private Location mLocation = null; public TestService() { super(TAG); } @Override public void onHandleIntent(Intent intent) { Log.d(TAG, "onHandleIntent"); if (mLocation == null) { Log.d(TAG, "launching location thread"); LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); LocationThread thread = new LocationThread(locationManager); thread.start(); try { thread.join(10000); } catch (InterruptedException e) { Log.d(TAG, "timeout"); return; } Log.d(TAG, "join finished, loc="+mLocation.toString()); } else { Log.d(TAG, "using existing loc="+mLocation.toString()); } } private class LocationThread extends Thread implements LocationListener { private LocationManager locationManager = null; public LocationThread(LocationManager locationManager) { super("UploaderService-Uploader"); this.locationManager = locationManager; } @Override public void run() { Log.d(TAG, "Thread.run"); Looper.prepare(); this.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); Looper.loop(); } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.d(TAG, "onLocationChanged("+location.toString()+")"); mLocation = location; Looper.myLooper().quit(); } @Override public void onProviderDisabled(String arg0) { } @Override public void onProviderEnabled(String arg0) { } @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } } } </code></pre> <p>Of interest in there is the Looper that runs a message loop on the thread (to allow handling of the callbacks).</p> <p>Given the effort required to do this with IntentService it might be worthwhile investigating deriving from Service instead and managing your own intent queue.</p>