2012-03-13 69 views
0

根据Android文档,这种情况非常普遍,但我仍然没有找到一个既不存在也不存在于网络上的直接解决方案。 所以我有一个服务,应该做这样的事情:如何从服务中获取Android位置更新请求

  1. 注册一个LocationListener的接收用户位置
  2. 一旦LocationListener的被称为 - 停止监听5分钟车
  3. 5分钟后,开始收听再次从1开始循环

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

作为一项服务,我有第3步的主要问题。 我发现“等待”5分钟的唯一方法是安排一个java.util.Timer在5分钟内执行TimerTask,并且此TimerTask应该注册LocationListneres再次。 了java.lang.RuntimeException: 然而,这并不因为工作内螺纹已不叫Looper.prepare无法创建处理程序() 这也有望因为requestLocationUpdates应该从一个“主”线程调用。

好..好...但我没有一个主线程。我没有活动。从TimerTask我不能发送意图到服务注册我的听众回来。

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

回答

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答案的范围 - 一本书需要几页来解释这一切。

+0

谢谢 - 引用的编码为我进一步开发我的应用程序提供了一个良好的开端。 – vap78 2012-03-14 17:24:38

0

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