LocationRequest setInterval(long millis)和LocationRequest setFastestInterval(long millis)之间的区别

时间:2014-09-30 06:42:29

标签: android gps location locationmanager

我在android中每隔5分钟写一次自己的后台位置更新。我想知道setInterval和setFastestInterval

之间的区别

当我将setInterval设置为5分钟并将setFastestInterval设置为2分钟时。每2分钟调用一次位置更新。

我想知道其中的区别。我无法理解这个https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html

的开发者页面中究竟写了什么

另外:只有当第一次更新的距离超过20米并且第二次更新时,是否有内置功能来检查位置更新?

谢谢!

4 个答案:

答案 0 :(得分:88)

通过Android查看引用:
https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html

setInterval(long)表示 - 设置您想要获取位置的时间间隔。 setFastestInterval(long)表示 - 如果某个位置很快就可以获得(即另一个应用程序正在使用位置服务)。

例如,您启动应用程序并通过setInterval(60 * 1000)注册它,这意味着您将每60秒获得一次更新。
现在你调用setFastestInterval(10 * 1000)。如果您是唯一使用位置服务的应用程序,您将每60秒继续接收更新。如果另一个应用正在使用具有更高更新率的位置服务,您将获得更多位置更新。

我相信它对你的应用程序所消耗的电池寿命有很好的影响,你可以定义你可以等待的最长时间,同时说如果有更新,你想要它。电池消耗将记入应用程序,该应用程序请求更频繁的更新而不是您的更新。

答案 1 :(得分:8)

  

另外:只有在第二次更新时第一次更新的距离超过20米时,是否有内置功能来检查位置更新?

LocationRequest有一种方法可用于设置更新之间的最小距离。

int minimumDistanceBetweenUpdates = 20;

LocationRequest request = new LocationRequest();
request.setMinimumDisplacement(minimumDistanceBetweenUpdates);
// ... request.setInterval(interval); etc

答案 2 :(得分:6)

  

我正在为android中的每个 5分钟的间隔编写自己的后台位置更新。我想知道setIntervalsetFastestInterval

之间的区别

假设setFastestInterval();具有更高的优先级来请求Location。对于您设置setFastestInterval();的任何应用,它将是将首先执行的应用(即使其他应用正在使用LocationServices)。

例如:如果 APP1 setFastestInterval(1000 * 10) APP2 setInterval(1000 * 10)两个APPS 都有相同的请求间隔。但是第一次请求是 APP1 。 (这是我所理解的,答案可能不正确)

  

当我setInterval 5分钟setFastestInterval 2分钟时。每 2分钟调用location update

如果您将setFastestInterval()setInterval()一起使用,该应用会尝试请求setFastestInterval()中给出的时间,这就是您的应用为什么会这样做的原因请求每 2分钟

  

另外:只有当第一次更新的距离超过20米并且第二次更新时,是否有内置功能来检查位置更新?

对于每20米发出一次请求,您可以创建LocationModel

    public class LocationModel {
    private double latitude;

    private double longitude;
    public LocationModel(){
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }
}

并在第一个请求中将latlong设置为当前位置(使用getLastLocation();

然后onLocationChanged()您从对象获取数据并与new Current Location

进行比较
float distanceInMeters = distFrom((float)locationObj.getLatitude(), (float)locationObj.getLongitude(), (float)mCurrentLocation.getLatitude(), (float)mCurrentLocation.getLongitude());

使用此功能,这也是SO

用户的建议
public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
    double earthRadius = 6371; //kilometers
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                    Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    float dist = (float) (earthRadius * c);

    return dist;
}

答案 3 :(得分:1)

setInterval(long millis) 这个间隔是不准确的。您可能根本没有收到更新(如果没有可用的位置源),或者您可能会收到比请求更慢的更新。您也可以比请求更快地收到它们(如果其他应用程序以更快的间隔请求位置)。可以使用setFastestInterval(long)控制您将收到更新的最快速率。默认情况下,此最快速率是间隔频率的6倍。

setFastestInterval(long millis) 与setInterval(long)不同,此参数是精确的。您的应用程序永远不会比此值更快地收到更新。 如果您不调用此方法,将为您选择最快的间隔。它将比您的活动间隔(setInterval(long))更快。