我需要实现基于位置的服务。我不需要精确的位置,因此不需要GPS。
最简单的方法是在应用开始时开始侦听位置更新,并将其保持开启状态:
mLocationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 100, mPendingIntent);
由于我不需要太多精确度,我将更新的最大频率设置为10秒和100米而不是默认值0,0。
当我们考虑位置时,我们认为电池耗尽,但我想这是一个快捷方式,只有GPS真正耗尽电池。我认为这种网络提供商的使用不会耗尽电池。有什么想法吗?
答案 0 :(得分:7)
Android Developers Guide中包含有关此内容的主题。我建议您查看页面上的代码示例。
这是他们提到的关于节省电池和各种参数的内容。
调整模型以节省电池和数据交换
在测试应用程序时,您可能会发现您的模型 提供良好的位置和良好的性能需要一些调整。 以下是您可能需要更改的一些内容,以便在两者之间找到平衡点 他们俩。减小窗口的大小
您收听位置更新的较小窗口意味着更少 因此,与GPS和网络位置服务的交互保持 电池寿命。但它也允许更少的位置 选择最佳估计。设置位置提供程序以返回更新 不太常见
降低窗口期间出现新更新的速率 也提高了电池效率,但代价是准确性。该 权衡取决于您的应用程序的使用方式。您 可以通过增加参数来降低更新速率 requestLocationUpdates()指定间隔时间和最小值 距离变化。限制一组提供者
取决于使用您的应用程序的环境或 期望的准确度,您可以选择仅使用网络 位置提供商或仅限GPS,而不是两者。仅与...进行交互 其中一项服务以潜在的成本降低电池使用量 精度。
基本上,请考虑降低您请求的更新频率或请求更新的时间。这就像高尔夫,你要求的位置越少越好。考虑以下用例:
在示例中,应用程序等待用户执行需要某个位置的操作,然后在不再需要位置数据后停止轮询。
虽然轮询不断允许应用程序立即准备好位置,但根本不值得浪费资源,为了减少请求位置时的延迟,您可以使用getLastKnownLocation (String provider)
。
修改强> 有一种方法可以确定各种LocationProviders的电源使用情况!
在LocationProvider上调用getPowerRequirement ()
将return one of three constants。
int POWER_HIGH A constant indicating a high power requirement.
int POWER_LOW A constant indicating a low power requirement.
int POWER_MEDIUM A constant indicating a medium power requirement.
为了使代码更具可读性,请在任何布尔检查中使用meetsCriteria (Criteria criteria)
来使代码更具可读性。
我会用它来确定您的应用程序应该使用哪种方法以获得最低的电源成本。此外,您还可以支持对提供商具有不同电源要求的设备。
答案 1 :(得分:6)
从电池电量消耗的角度来看,您的100米距离滤波器对您来说无济于事。这只会控制PendingIntent
由于修复而被执行的次数。
操作系统可以使用10秒的时间值 来控制用电量,但无法保证。并且,如果值很低,那么它的使用率似乎不太可能。每小时,也许,但不是每10秒钟。
更重要的是,您需要始终保持CPU通电。而且,由于您正在使用PendingIntent
requestLocationUpdates()
的{{1}}风格,我猜您计划长时间收集数据。
如果您只有COARSE
权限,Android有望避开WiFi热点接近检测,这将节省一些电量。
总的来说,网络提供商将比GPS提供商消耗更少的电力。 “少”与“小”相去甚远。在Nexus级Android设备上,GPS + CPU为我提供了几个小时的电池续航时间(通过使用Google导航确定)。我希望网络提供商+ CPU可以持续几个小时,但这就是它,因为CPU本身就是一个相当大的电池消耗。
我更关心的是:
最简单的方法是在应用开始时开始侦听位置更新,并将其保持开启状态
这听起来好像您实际上并没有计划删除您的位置更新。这是一个非常糟糕的主意,任何类型的提供程序(除了可能被动提供程序)。当您注册和删除更新时,请有一个更具体的计划。特别是,确保用户能够控制何时消耗电池到这个程度。