2012-01-20 58 views
3

我需要实施基于位置的服务。我不需要很好的位置,所以不需要GPS。位置提供商真的是电池消耗?

最简单的将是开始监听在应用程序启动位置更新,并把它留在:

mLocationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 100, mPendingIntent); 

因为我并不需要太多的准确性,我设置的更新频率最高,为10秒,和100米而不是默认的0,0.

当我们认为位置,我们认为电池耗尽,但我想这是一个捷径,只有GPS真正耗尽电池。我认为网络提供商的这种使用不会耗尽电池。有什么想法吗?

+1

那么你可以随时写测试。以两种方式压缩基于位置的服务,每个服务一小时。然后看看每个电池的电量是多少。 – JPM

+0

我没有任何统计数据来备份我对此的看法。所以拿它的价值来说吧。但我认为是的,尽管它不会像电池使用时那样耗费大量电池,并且有时间,而接近度设置为最低。与完全没有这样做相比,它仍然是电池的显着消耗。我的经验纯粹从用户的角度来看,我没有创造任何利用它的东西。伟大的建议JPM,如果你打算这样做,检查市场上的应用程序“电池图”。对于这种类型的测试来说是完美的。 – FoamyGuy

回答

6

从电池放电的角度来看,您的100米距离过滤器对您几乎没有任何作用。这只会控制您的PendingIntent由于修复而被执行多少次。

您的10秒时间值可能是被操作系统用来控制用电量,但不能保证。而且,在这样低的价值下,它似乎不太可能被使用。每个小时,也许,但不是每10秒。

更重要的是,您将需要始终保持CPU处于开机状态。而且,由于您使用的是requestLocationUpdates()PendingIntent,所以我猜测您计划长时间收集数据。

如果您只有COARSE权限,Android有望避开WiFi热点接近度检测,这将节省一些电量。总体而言,网络提供商将比GPS提供商消耗更少的功率。 “少”与“小”相差甚远。在Nexus级Android设备上,GPS + CPU给我几个小时的电池使用时间(根据使用Google导航确定)。我希望网络提供商+ CPU的使用时间可以延长几个小时,但这只是一个问题,因为CPU本身就是一个相当大的电池消耗。

我更大的担忧是:

最简单的将是开始监听在应用程序启动位置更新,并把它留在

这听起来像是你是不是真正的删除计划你的位置更新。这是一个非常糟糕的主意,任何类型的提供者(除了或许是被动提供者)。当你注册并删除更新时,请有一个更具体的计划。特别是,确保用户有能力控制何时消耗电池达到此程度。

7

Android Developers Guide中包含一个关于此的主题。我建议你看一下页面上的代码示例。

这是他们提到的关于节约电池和各种参数。

调整模式以节省电池和数据交换

当你测试你的应用程序,你可能会发现,你的 提供良好的地理位置和良好的性能模型需要一些调整。 以下是您可能需要更改的一些事项,以便在两者之间找到一个很好的平衡点 。减小窗口的大小

您在侦听位置更新的较小窗口意味着较少的与GPS和网络位置服务的互动,因此保留了电池寿命 。但它也允许更少的地点从中选择最佳估计值。设置位置提供商以返回更新 不太频繁

降低窗口期间出现新更新的速率 也会提高电池效率,但会以牺牲准确性为代价。取舍的价值取决于您的应用程序的使用方式。您 可以通过增加requestLocationUpdates()中的参数来减少更新速率,该参数指定间隔时间和最小距离更改。限制一组提供商

取决于在使用你的应用环境或精度 期望的水平,你可以选择只使用网络 位置提供者或只有GPS,而不是两个。仅与 互动,其中一项服务可降低电池使用量,其潜在成本精度为 。

基本上,考虑减少您请求的更新频率或请求它们的时间长度。这就像高尔夫,你要求的位置越少越好。考虑以下用例: An example of location based content tagging

在该示例中,应用程序将等待用户执行需要位置的操作,然后在不再需要位置数据时停止轮询。

虽然不断轮询可以让应用程序在即时通知的位置准备就绪,但它不值得浪费资源,为了减轻请求位置时的延迟,您可以使用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

是的,我在发布stackoverflow之前已经阅读了这整个教程:-)。我担心的是,他们在电池耗尽时没有区分GPS和网络位置提供商。 – muslidrikk

+1

我将最后一条评论写入答案,请参阅底部的编辑并让我知道它是否回答您的问题。 –

+0

听起来像是一个很好的提示来检查电源要求! – muslidrikk