У меня проблема, аналогичная заданному здесь вопросу: Отправка сообщения обработчику в мертвом потоке при получении местоположения от IntentService
Я поместил LocationListener в IntentService, который, как я слышал, является плохим местом для его размещения, поскольку прослушиватель уничтожается после завершения onHandleIntent()
.
Моя служба намерений проверяет последнее известное местоположение на основе GPS и сетевого провайдера. Я ищу способ «разбудить» локатор GPS и сети, прежде чем проверять, где находится пользователь.
Служба IntentService запускается каждую минуту и проверяет наличие обновленного местоположения каждые 5–30 минут. Есть ли способ настроить requestLocationUpdates
, который я могу вызвать перед фактической проверкой местоположения?
12-31 14:09:33.664: W/MessageQueue(3264): Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread
12-31 14:09:33.664: W/MessageQueue(3264): java.lang.RuntimeException: Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageAtTime(Handler.java:473)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageDelayed(Handler.java:446)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessage(Handler.java:383)
12-31 14:09:33.664: W/MessageQueue(3264): at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:193)
12-31 14:09:33.664: W/MessageQueue(3264): at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58)
12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Binder.execTransact(Binder.java:338)
12-31 14:09:33.664: W/MessageQueue(3264): at dalvik.system.NativeStart.run(Native Method)
Запланированная служба
public class ScheduledService extends IntentService {
private LocationManager lm;
LocationListener locationListener;
public ScheduledService() {
super("ScheduledService");
}
@Override
protected void onHandleIntent(Intent intent) {
lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
lm.removeUpdates(this);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
if(isNetworkAvailable()) {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
try {
Location lastKnownLocation = getBestLocation();
double lat = lastKnownLocation.getLatitude();
double lon = lastKnownLocation.getLongitude();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}