Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么';使用LocationClient定期获取更新的最节省电池电量的方法是什么?_Android_Timer_Geolocation_Google Play Services - Fatal编程技术网

Android 什么';使用LocationClient定期获取更新的最节省电池电量的方法是什么?

Android 什么';使用LocationClient定期获取更新的最节省电池电量的方法是什么?,android,timer,geolocation,google-play-services,Android,Timer,Geolocation,Google Play Services,我正在考虑每小时使用两个单独的警报来收集用户的位置数据,一个警报每59分钟发出一次,用于“连接”客户端,另一个警报用于实际获取位置,然后断开客户端 在电池寿命方面,如果让用户的位置成为应用程序的主要消耗,还有什么需要考虑的吗?或者,有没有一种不同的方法来设置两个警报?我最初只有一个警报,但执行(!mLocationClient.isConnected)然后执行连接检查并没有给客户端足够的时间进行连接 谢谢你的洞察力 这两个警报会发出类似这样的声音: private int PERIODIC_UP

我正在考虑每小时使用两个单独的警报来收集用户的位置数据,一个警报每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);

你真的需要跟踪用户吗

如果只是关于用户界面,那么使用getLastKnownLocation(被动_提供者),你应该得到一些半精确的信息,假设他们在其他地方使用手机上的定位服务

如果您需要实际对用户进行三角测量,请意识到不同的提供商使用不同的电池。被动<网络 定位用户越多,GPS占用的电池和时间越多

按计划表、1小时或任何时间开始服务,只需一次服务。最多只能直播1分钟(或更短),请收听所有位置提供商。分钟或准确度足够好后,保存结果并关闭服务。

请参阅Android开发者文档中的“接收位置更新”部分,以了解与新Fused Location Provider有关此主题的详细讨论:

这使您可以选择向融合的LocationProvider注册LocationListener意图,当内部Google服务框架认为这样做“有效”时,它会自动触发融合的LocationProvider。我相信这个框架在优化用电方面有更大的潜力,因为它比应用程序注册的定时器更了解系统中正在发生的事情

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

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

电池效率最高的方法是禁用所有Messenger应用程序,并关闭显示器。然后,您可以每秒录制一次GPS,持续8小时以上。@jsc123请注意,将Fused Location Provider与“getLastLocation()”一起使用并不能保证GPS位置-您可能会获得一个主要基于传感器、WiFi或蜂窝连接的位置。此外,您不一定要强制更新位置,因此如果没有其他应用程序(包括谷歌服务)请求更新位置,您可能会得到与上次相同的位置。@SeanBarbeau,如果我总是定期尝试获取最准确的位置,即使这是一个更大的消耗,我的实现不是最好的吗?“最佳”根据应用程序的用途,这是非常主观的-你真的需要弄清楚为什么你要跟踪用户,准确度和能量消耗是合适的。然后,将此与我在回答中列出的融合位置提供商的优先事项相匹配。嗨,哈默德,谢谢你的建议。我希望使用GPS尽可能精确。因此,上面的代码有意义吗?为了节省电池,我在使用该位置后立即断开连接。这会不会节省电池寿命,因为我没有持续连接,只有大约1分钟。是的,在三角测量后断开连接,但假设GPS可能不会在一分钟内锁定,因此,如果gps出现故障,您可能需要使用其他提供商。请注意,如果要指定提供商,您不能使用LocationClient和Google Play服务,或者您问题中的代码,您必须使用原始的Android Location API。LocationClient使用融合的提供程序,仅返回getProvider()=“融合”的位置