【问题标题】:What's the most battery-efficient approach of using LocationClient to periodically get updates?使用 LocationClient 定期获取更新最省电的方法是什么?
【发布时间】:2013-06-17 03:05:27
【问题描述】:

我正在考虑设置两个单独的警报来每小时收集用户的位置数据,一个每 59 分钟触发一次以“连接”客户端,另一个用于实际获取位置,然后断开客户端。

在电池寿命方面,如果获取用户的位置将成为应用程序的主要消耗,我还应该考虑做些什么吗?或者,是否有不同的方法来设置两个警报?我最初只有一个警报,但是执行 (!mLocationClient.isConnected) 然后进行连接检查并没有给客户端足够的时间来连接。

感谢您的洞察力。

两个警报会像这样响起:

private int PERIODIC_UPDATE = 60000*60;  //gets location and disconnects every hour
private int PERIODIC_RECONNECTION_UPDATE = 60000*59;  //connects 1 minute before getLocation call

    Timer toReconnect = new Timer();
    toReconnect.schedule(new TimerTask() {

        @Override
        public void run() {
            mLocationClient.connect();
        }
    }, 5000, PERIODIC_RECONNECTION_UPDATE);

    Timer theTimer = new Timer(); 
    theTimer.schedule(new TimerTask(){
        @Override
        public void run() {
            try {
                if(!mLocationClient.isConnected()) {
                    mLocationClient.connect();
                    //This will not have much affect because cannot so quickly, will remove. 
                }

                Location theLocation = mLocationClient.getLastLocation();
                if(theLocation!=null) {
                    checkPostLocation(theLocation); 

                    mLocationClient.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }   
        }}, 5000, PERIODIC_UPDATE);

【问题讨论】:

  • 最省电的方法是禁用所有 Messenger 应用程序,并关闭显示。然后您可以每秒记录一次 GPS 超过 8 小时。
  • @jsc123 请注意,将 Fused Location Provider 与“getLastLocation()”一起使用并不能保证 GPS 位置 - 您可能会获得主要基于传感器、WiFi 或蜂窝连接的位置。此外,您不一定要强制使用新位置,因此如果没有其他应用(包括 Google 服务)请求更新位置,您可能会获得与上次相同的位置。
  • @SeanBarbeau,如果我总是试图定期获取最准确的位置,即使它是一个更大的消耗,我的实现不是最好的吗?
  • “最佳”是非常主观的,具体取决于您的应用程序的用途 - 您确实需要弄清楚您想要跟踪用户的确切原因以及合适的准确度和能量消耗。然后,将其与我在融合位置提供者的答案中列出的优先级相匹配。

标签: android timer geolocation google-play-services


【解决方案1】:

请参阅 Android 开发人员文档中的“接收位置更新”部分,以使用新的 Fused LocationProvider 详细讨论此主题:

http://developer.android.com/training/location/receive-location-updates.html

这使您可以选择将带有 LocationListener 的 Intent 注册到 Fused LocationProvider,当内部 Google 服务框架被认为“高效”时,该功能会自动触发。我相信这个框架在优化电源使用方面具有更大的潜力,因为与应用注册的计时器相比,它对系统中发生的其他事情有更多的了解。

以下是您注册具有不同电源优先级的侦听器的选项,这将导致不同级别的电池消耗,如上述文档中所列:

  • PRIORITY_BALANCED_POWER_ACCURACY - 与 setPriority(int) 一起使用以请求“块”级精度。块级精度被认为是大约 100 米的精度。使用这样的粗略精度通常会消耗更少的电量。
  • PRIORITY_HIGH_ACCURACY - 与 setPriority(int) 一起使用以请求最准确的可用位置。这将返回可用的最佳位置(以及最大的能量消耗潜力)。
  • PRIORITY_NO_POWER - 与 setPriority(int) 一起使用,以在零额外功耗的情况下请求尽可能高的精度。除非其他客户端请求位置更新,否则不会返回任何位置,在这种情况下,此请求将充当这些位置的被动侦听器。

【讨论】:

    【解决方案2】:

    你真的需要跟踪用户吗?

    如果只是关于 UI,那么使用 getLastKnownLocation(PASSIVE_PROVIDER) 并且假设他们在其他地方使用手机上的定位服务,您应该会得到一些半准确的信息。

    如果您需要实际对用户进行三角测量,请实现不同的供应商使用不同的电池。被动

    定位用户越多,GPS 消耗的电量和时间就越多。

    按计划、1 小时或其他任何时间启动服务,只需要一项服务。最多只能活 1 分钟(或更短),收听所有位置提供商。在分钟或准确度足够好后,您保存结果并关闭服务。

    【讨论】:

    • 嗨HaMMeReD,感谢您的建议。我想尽可能精确地使用 GPS。那么,上面的代码有意义吗?为了节省电池,我在使用该位置后立即断开连接。这不会节省电池寿命,因为我没有持续连接,而是只有大约 1 分钟。
    • 是的,三角测量后断开连接,但假设 GPS 可能不会在一分钟内锁定,因此您可能希望在 gps 失败的情况下使用其他提供商。
    • 请注意,如果要指定提供者,您不能使用 LocationClient 和 Google Play 服务,或者您问题中的代码 - 您必须使用原始的 Android Location API。 LocationClient 使用融合的提供者,并且只返回带有 getProvider() = "fused" 的位置
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多