Похоже, что ваш метод onHandleIntent не блокирует поток, в котором он выполняется, поэтому он быстро вернется и позволит обработать второе намерение. Более того, маловероятно, что любые обратные вызовы из LocationManager в этот поток будут обрабатываться, так как фоновый поток может быть уничтожен, когда завершится onHandleIntent.
Если вы действительно хотите использовать IntentService для управления своей очередью намерений, вам нужно будет выполнить обработку вашего местоположения в своем собственном потоке и присоединить поток IntentService к потоку местоположения, пока он ожидает обратного вызова местоположения.
Вот немного кода, который демонстрирует идею:
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) {
}
}
}
Интерес представляет Looper, который запускает цикл сообщений в потоке (чтобы разрешить обработку обратных вызовов).
Учитывая усилия, требуемые для этого с IntentService, может быть, стоит вместо этого изучить наследование от Service и управление своей собственной очередью намерений.