我有这个问题,我正在创建一个在后台作为服务运行的应用程序。我已经设法让它持久化并在启动时运行,这是我需要的。现在我有这种情况:
在这项服务中,我开始一个主题 - >在这个主题中,我想启动一个Intent Service来从GPS(位置)收集数据。这似乎很容易。
我遇到的问题是将通过Intent Service收集的位置返回给此主题。
我发现很多关于在活动和服务之间传递数据的问题,但没有关于服务和线程的问题。
我当然可以在我的主服务中嵌入我的Intent服务,并从Intent Service更改服务变量,检查它是否在循环内被更改。但它似乎效率很低 - 我宁愿以其他方式去做。
因此,我想问一下如何实现它?
提前致谢
答案 0 :(得分:1)
在这项服务中,我开始一个主题 - >在这个主题中,我想启动一个Intent Service来从GPS(位置)收集数据。这似乎很容易。
不是。
我遇到的问题是将通过Intent Service收集的位置返回给此主题。
然后你做错了。
IntentService
在获取定位方面毫无用处。位置修复程序立即可用(在这种情况下,IntentService
是不必要的),或者位置修复程序仅在将来的某个任意时间可用(在这种情况下,IntentService
将关闭很久以前,阻止你首先可靠地获得修复。)
如果您使用Play Services SDK中的LocationClient
,只需从您主要服务中的线程中获取该位置。
如果您使用LocationManager
(例如,您坚持必须使用GPS,而不是LocationClient
使用的“融合位置提供商”),则需要重写您的应用以避免阻止 - 直到位置可用的逻辑。相反,使用事件驱动的编程,使用requestLocationUpdates()
并在到达时处理这些位置。您可以使用requestLocationUpdates()
的变体Looper
,与您创建的HandlerThread
相关联,以便能够在后台线程中处理这些修复。