具有locationListener回调的Android服务

时间:2010-09-18 21:01:05

标签: android service geolocation locationlistener

我有一个Android应用程序。根据用户当前的地理位置,我想在后台获取一些远程数据并存储它。我的实现是:

在特定时间间隔,警报会启动我的服务。 Service使用匿名类来查询当前位置并注册locationListener回调。在调用onLocationChanged()时,我启动了从服务器获取远程数据。

但是,一旦我的服务使用anonymos类注册位置监听器,它就会按预期返回;因为它不会在完成之前等待回调发生。由于回调需要一些时间并且在服务已经返回时进行调用,因此会抛出错误说:

java.lang.RuntimeException: Handler{43e82510} sending message to a Handler on a dead thread

这是可以理解的。我现在的一个快速解决方法是,我可以使用来自locationManager的getLastKnownLocation,因为它不会通过回调来响应;但是,如果我现在想要最新的位置,在服务而不是活动中怎么办?我怎样才能等待回调发生并停止我的服务返回。

此外,lastKnownlocation在什么时候更新?每次GPS注册新位置;它更新了吗?我想知道的是,如果它不是最新的,它仍然可以关闭到最新?因为我没有在android模拟器中看到一个选项来配置后续更新之间的时间段。

非常感谢任何帮助。 干杯

1 个答案:

答案 0 :(得分:4)

  

但如果我现在想要最新的位置,在服务而不是活动中会怎么样?

很抱歉,但在服务或活动中无法做到这一点。例如,如果GPS无线电关闭,并且您要求GPS提供位置数据,则需要几十秒才能获得修复,如果您幸运的话,那就是这样。它可能根本无法修复。

  

我如何等待回调发生并停止我的服务返回。

你没有。你做你说你会做的事情:

  

使用来自locationManager的getLastKnownLocation,因为它没有回调回调

所以,让你的Service(希望是IntentService)检查getLastKnownLocation()是否恰好有值。如果是,请使用它。否则,registerLocationUpdates()使用PendingIntent将控制权传回您的IntentService。当您获得 Intent时,请使用位置并注销更新(假设警报周期很长很长,例如每小时一次)。

如果您的闹钟是_WAKEUP警报,事情会变得棘手。然后,您需要按住WakeLock,这样设备在您尝试获取GPS定位时就不会重新入睡。但是,您需要在某个时间发布WakeLock,如果我们无法获得GPS修复......嗯......好吧,那是棘手的部分。试图找出一个很好的处理方法,并将其作为可重用的组件(例如LocationAlarmService)实现,是我待办事项列表中的18,000个项目之一。

  

此外,lastKnownlocation在什么时候更新?每次GPS注册新位置;它>更新它?

AFAIK,是的。