我在android中每隔5分钟写一次自己的后台位置更新。我想知道setInterval和setFastestInterval
之间的区别当我将setInterval设置为5分钟并将setFastestInterval设置为2分钟时。每2分钟调用一次位置更新。
我想知道其中的区别。我无法理解这个https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html
的开发者页面中究竟写了什么另外:只有当第一次更新的距离超过20米并且第二次更新时,是否有内置功能来检查位置更新?
谢谢!
答案 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分钟的间隔编写自己的后台位置更新。我想知道
之间的区别setInterval
和setFastestInterval
假设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;
}
}
并在第一个请求中将lat
和long
设置为当前位置(使用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))更快。