【发布时间】:2012-03-01 18:51:02
【问题描述】:
我正在尝试编写一个服务,它会每隔 X 分钟尝试获取设备的 GPS 位置,并在后台运行和记录,即使应用程序不在焦点中也是如此。
那么,是时候创建一个服务了。
我创建了一个服务,设置了 locationListener,得到了 location Manager 和 requestLocationUpdates……一切都很好……基本的骨架正在工作。
现在,我不希望 GPS 一直运行,因为这会耗尽电池,我想要的是服务,启动 GPS,请求更新,然后关闭(至少它对gps 位置),然后 5 或 10 分钟后再次执行此操作..
很简单,在我的监听器的 onLocationChanged() 方法上,我添加了一行 LocationManager (removeUpdates(locationListener)).. 所以当我的服务请求更新时,它只得到一个,然后关闭。
我决定添加一个小的 while 循环,它可以有效地注册我的位置监听器,并休眠 X 分钟。所以从逻辑上讲,它应该注册它需要信息,然后休眠.. 一个更新进来,我在 onLocationChange 中得到那个更新,它取消注册它对事件的兴趣,关闭 GPS 直到下一次执行循环。
现在,我有 2 个问题 1) 这在逻辑上是否可行?还是有更优雅的方式?请记住,我希望它记录启动应用程序是否处于焦点的信息,老实说,即使启动应用程序被终止,我也希望该服务可能继续运行,但这是我尚未完全做出的设计决定。
第二个问题是,我需要把这个循环放在一个线程中,因为它在 oncreate 中,导致服务最终被杀死,因为它需要很长时间才能从 oncreate 中返回,那么最好的方法是什么去做这件事? AsyncTask 是一个选项,但这是一个理论上永远不会完成的任务。处理程序似乎也有点傻,因为没有真正的回调,它只是注册 GPS 更新,并且不感兴趣的代码在 LocationListener onLocationChange()。
一旦实例化,这个线程就不会产生真正的通信,尽管当服务将被某些用户交互关闭时,它需要发出终止/结束的信号......
所以我应该只使用基本线程吗?即使它永远不会真正回来,也要使用 AsyncTask?还是使用 Handler 是更好的选择?或者我的模型只是完全坏的形式?
【问题讨论】:
标签: android service background gps