【发布时间】:2022-02-11 23:47:55
【问题描述】:
我想每 5 分钟更新一次位置,直到应用程序的生命周期。我知道如何更新位置。我想知道的是 requestForLocation 是否是阻塞调用。
我可以在 Service 类中执行此操作,但 Service 仅在主线程上运行,而且 Service 可以随时被系统停止。我不希望这种情况发生。位置更新应该一直有效,直到应用程序在内存中。如果应用程序本身被杀死,那么显然服务也会被杀死。
实现这一点的方法应该是什么?
【问题讨论】:
我想每 5 分钟更新一次位置,直到应用程序的生命周期。我知道如何更新位置。我想知道的是 requestForLocation 是否是阻塞调用。
我可以在 Service 类中执行此操作,但 Service 仅在主线程上运行,而且 Service 可以随时被系统停止。我不希望这种情况发生。位置更新应该一直有效,直到应用程序在内存中。如果应用程序本身被杀死,那么显然服务也会被杀死。
实现这一点的方法应该是什么?
【问题讨论】:
我想知道 requestForLocation 是否是阻塞调用。
Android 中没有名为 requestForLocation() 或 requestForLocationUpdates() 的方法。如果你的意思是requestLocationUpdates(),这不是阻塞调用。
我不希望这种情况发生。
用户和操作系统有权随时终止您的服务。在这种情况下,这是一件好事,因为您提出的计划浪费了 RAM 而没有任何好处。
实现这一点的方法应该是什么?
使用AlarmManager 和类似于我的LocationPoller 的服务,这样您就可以获取您的位置数据,对其进行处理,然后关闭直到下一个周期到来。
另外,请允许您的用户配置投票周期,包括“不投票”选项。
【讨论】:
requestLocationUpdates() 的时间参数是一个提示,而不是规则,您可能会比这更快地得到修复。其次,这种模式迫使您尝试(并且失败)始终将服务保留在内存中,始终保持 GPS 开启,这将导致您的用户成群结队地抛弃您,并在市场上给您一星评级将他们的设备电池寿命缩短到几个小时。
出于某种原因,这个requestLocationUpdates() 电话确实会阻塞,至少在我测试的手机品牌中是这样。修复它的方法是使用它的重载之一。请在another post 中查看此答案。
【讨论】: