如何在服务中安排Android中的位置更新请求

时间:2012-03-13 21:37:45

标签: android service locationlistener

根据Android文档,这种情况非常常见,但我仍然没有在网上找到直接的解决方案。 所以我有一项服务应该做这样的事情:

  1. 注册LocationListener以接收用户位置
  2. 调用LocationListener后 - 停止听5分钟
  3. 5分钟后再次开始收听并从1
  4. 循环

    这是在聆听用户位置时节省电池电量的推荐方法。

    作为一项服务,我遇到了第3步的主要问题。 我发现“等待”5分钟的唯一方法是安排java.util.Timer在5分钟内执行TimerTask,这个TimerTask应该再次注册LocationListneres。 但是这不起作用,因为: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 这也是预期的,因为requestLocationUpdates应该从“主”线程调用。

    好的......很好......但我没有主线程。我没有活动。从TimerTask我无法向服务发送意图来注册我的监听器。

    如何让我自己的服务再次注册我的听众?

2 个答案:

答案 0 :(得分:1)

  

这是在聆听用户位置时节省电池电量的推荐方法。

真的?如果您使用AlarmManager进行五分钟延迟,那么唯一的方法就是良好的模式,因此设备在位置检查之间会睡着。

  

我发现“等待”5分钟的唯一方法是安排java.util.Timer在5分钟内执行TimerTask,这个TimerTask应该再次注册LocationListneres。

这将是一个可怕的电池使用,因为这意味着你需要不断保持设备通电,而不是让它进入睡眠状态。

  

我没有主线程

是的,你这样做。所有进程都有一个主应用程序线程。在主应用程序线程上调用服务的onCreate()onStartCommand()等。

  

我没有活动。

然后你最好写一个,因为没有它你的应用程序将无法在Android 3.1+上运行。在用户在Android 3.1 +上启动您的某项活动之前,您的应用才会投放。

  

如何让我自己的服务再次注册我的听众?

你想要完成的是一个相当复杂的问题。您不仅需要安排设备入睡并再次唤醒,还需要处理大量边缘情况(例如,如果没有可用的位置,因为设备处于飞行模式或地下或什么?)。

我写了LocationPoller来处理你的用例,还写了另一个开发人员forked it to create a more feature-rich implementation

无论您是直接使用其中一种还是仅仅检查它们的实现,它们都应该有助于您了解如何解决此问题。但是,所有细节都超出了StackOverflow答案的范围 - 书中需要几页才能解释所有细节。

答案 1 :(得分:0)

您可以在requeestLocationUpdates()中指定参数,使其在一段时间后运行。