带有 locationListener 回调的 Android 服务
Posted
技术标签:
【中文标题】带有 locationListener 回调的 Android 服务【英文标题】:Android service with locationListener callbacks 【发布时间】:2011-04-14 04:42:05 【问题描述】:我有一个安卓应用程序。根据用户当前的地理位置,我想在后台获取一些远程数据并存储。我的实现是:
在特定的时间间隔,警报会启动我的服务。服务使用匿名类查询当前位置并注册一个 locationListener 回调。在调用 onLocationChanged() 时,我启动从服务器获取远程数据。
但是,一旦我的服务完成使用匿名类注册位置侦听器,它就会按预期返回;因为它不会在完成之前等待回调发生。由于回调需要一些时间并在服务已经返回时进行调用,所以它会抛出一个错误:
java.lang.RuntimeException: Handler43e82510 sending message to a Handler on a dead thread
这很好理解。现在对我来说一个快速的解决方法是我可以使用 locationManager 中的 getLastKnownLocation ,因为它不会通过回调响应;但是如果我现在确实想要最新的位置,在服务中而不是活动中怎么办?如何等待回调发生并停止我的服务返回。
另外,lastKnownlocation 什么时候更新?每次 GPS 注册一个新位置时;它会更新吗?我想知道的是,如果它不是最新的,它仍然可以关闭到最新吗?因为我没有在 android 模拟器中看到用于配置后续更新之间的时间段的选项。
非常感谢任何帮助。 干杯
【问题讨论】:
【参考方案1】:但是如果我现在确实想要最新的位置,在服务中而不是在活动中呢?
抱歉,这在服务或活动中都是不可能的。例如,如果 GPS 无线电已关闭,而您正在从 GPS 请求位置数据,则需要数十秒才能得到修复,如果您很幸运的话。它可能根本无法修复。
如何等待回调发生并阻止我的服务返回。
你没有。你按照你说的去做:
使用 locationManager 中的 getLastKnownLocation,因为它不会通过回调响应
所以,让您的Service
(希望是IntentService
)检查getLastKnownLocation()
是否恰好有一个值。如果是,请使用它。否则,registerLocationUpdates()
使用 PendingIntent
将控制权交还给您的 IntentService
。当你得到那个Intent
时,使用该位置并取消注册更新(假设警报周期很好而且很长,比如每小时一次)。
如果您的闹钟是 _WAKEUP 闹钟,事情就会变得棘手。然后,您将需要持有WakeLock
,以便在您尝试获取 GPS 定位时设备不会重新进入睡眠状态。但是,您需要在某个时间发布 WakeLock
,如果我们无法获得 GPS 定位...嗯...嗯,这就是棘手的部分。试图找出一种干净的方式来处理这个问题,并将其实现为可重用的组件(例如,LocationAlarmService
),这是我的待办事项清单上的 18,000 项之一。
另外,lastKnownlocation 什么时候更新?每次 GPS 注册一个新位置时;它 > 更新了吗?
AFAIK,是的。
【讨论】:
非常感谢马克,这确实为我解决了很多问题。至少它重新确立了我不是唯一一个无法做到这一点的人的信念。 :) 当你完成待办事项列表时告诉我。此外,Google Play 服务定位服务可能有助于获取位置。以上是关于带有 locationListener 回调的 Android 服务的主要内容,如果未能解决你的问题,请参考以下文章
调用 requestLocationUpdates() 时不能将活动用作 LocationListener 的实例
Android 位置:PendingIntent 与 LocationListener
locationListener + manager 与 GoogleServices + locationClient