根据Android文档,这种情况非常常见,但我仍然没有在网上找到直接的解决方案。 所以我有一项服务应该做这样的事情:
这是在聆听用户位置时节省电池电量的推荐方法。
作为一项服务,我遇到了第3步的主要问题。 我发现“等待”5分钟的唯一方法是安排java.util.Timer在5分钟内执行TimerTask,这个TimerTask应该再次注册LocationListneres。 但是这不起作用,因为: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序 这也是预期的,因为requestLocationUpdates应该从“主”线程调用。
好的......很好......但我没有主线程。我没有活动。从TimerTask我无法向服务发送意图来注册我的监听器。
如何让我自己的服务再次注册我的听众?
答案 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()
中指定参数,使其在一段时间后运行。