当搜索位置时,防止GPS耗尽手机电池

3
我正在使用LocationManager的方法requestLocationUpdates来获取手机的位置。
我使用GPS作为提供者,并使用LocationListener来更新我的应用程序的UI。
我需要每1000毫秒调用一次Activity上的一个方法。为此,我将requestLocationUpdates配置如下:
locationManager.requestLocationUpdates(provider, 0, 1000, listener);

一切运行良好。onLocationChanged方法被调用,经度和纬度都正常显示。但我有一些疑问:
1.如果我在没有GPS信号的地方会发生什么情况?
2.是否存在一些自动超时机制?
3.还是应用程序将一直尝试使用GPS获取位置,并且会耗费电池电量?
4.如果我切换到Wi-Fi/3G提供商并且那些信号也不起作用,会发生同样的事情吗?
我搜索互联网寻找答案,但找不到正确的解决方案。

  1. 如果你没有GPS和提供者信号,你将无法获取位置。
  2. 据我所知,它会一直运行,直到你或服务器停止它(一旦达到最大请求,服务器将停止它)。
  3. 是的,定期请求(尤其是每1000毫秒一次,即使它不会真正快速拉取)会消耗你的电池电量。
  4. 如果你切换到你的提供者,但他们的工作效果不好,你将无法获得更新。你必须有某种连接来获取位置更新。
- zgc7009
所以使用GPS或WiFi/3G,如果没有信号,如果我不采取一种方式来停止"拉电",电池会被耗尽吗?有正确的方法可以做到这一点吗?谢谢 - Mark Comix
如果您没有信号,它将继续寻找信号,这最终会耗尽您的电池。您可以设置某种计时器,一旦您在一定时间内没有获得信号,就会停止服务并提示用户在有信号时重试。 - zgc7009
1个回答

2
例如,假设您正在驾车,LocationManager连接到有效的GPS提供程序。现在您正在通过隧道行驶并且失去了信号。现在onLocationChanged()不再被触发。但是系统将在后台继续搜索有效的GPS提供程序。如果您通过隧道,系统将重新连接到GPS提供程序(如果仍然可用),并再次触发onLocationChanged()
连接并获取位置更新时的电池消耗要比系统寻找有效提供程序时高得多。
如果您切换到WiFi或3G,则系统会查找上一次设置的提供程序并覆盖先前的提供程序。但行为将相同。
您可以通过监视LocationListener.onStatusChanged()回调和GpsStatus.Listener接口来对此事件作出反应。例如,切换到另一个提供程序,或者如果没有提供程序可用,则调用removeLocationUpdates(),并在一段时间后使用Timer再次调用requestLocationUpdates()。这将更好地节省您的电池。

LocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)会在设备的设置中启用GPS时返回true。它并不表示您已连接到GPS提供程序。 使用方法LocationManager.getBestProvider(Criteria, boolean)来知道可用的提供程序。

请注意:如果您在室内,几乎永远无法连接到GPS。


我正在测试这种情况。我在我的房子里(室内没有GPS信号)。我运行我的应用程序。该应用程序使用locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)检查GPS并返回true。但是,当调用方法locationManager.requestLocationUpdates(provider,0,1000,listener)时,开始尝试获取信号,但什么也没有发生。没有任何LocationListener方法被调用。不是onLocationChanged,也不是onStatusChanged,什么都没有。在这种情况下,电池电量会耗尽,我不知道该怎么办。 - Mark Comix
谢谢你的回答。所以你是告诉我我是正确的。问题是没有任何方法来截断GPS拉取吗?没有添加超时的方法吗?有没有一种正确而简单的方法可以做到这一点? - Mark Comix
是的,只有 removeLocationUpdates(...) 才能停止这个机制。 - Steve Benett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接