Ich schreibe meine eigenen Hintergrund-Standort-Updates für alle 5 Minuten in Android. Ich würde gerne den Unterschied zwischen setInterval
und kennensetFastestInterval
Angenommen, der setFastestInterval();
hat eine höhere Priorität für die Anforderung von a Location
. Für jede App, die Sie festlegen setFastestInterval();
, wird diese App zuerst ausgeführt (auch wenn andere Apps verwendet werden LocationServices
).
ex: Wenn APP1 hat setFastestInterval(1000 * 10)
und APP2 hat setInterval(1000 * 10)
, beide APPS haben gleiches Abfrageintervall. Aber es ist die APP1 , die die erste Anfrage stellt. (das habe ich verstanden, die Antwort ist vielleicht nicht richtig)
Wenn ich setInterval
zu 5 Minuten und setFastestInterval
zu 2 Minuten . Das location update
wird alle 2 Minuten aufgerufen .
Wenn Sie setFastestInterval()
zusammen mit der setInterval()
App versuchen, eine Anfrage für die in der angegebene Zeit zu stellen setFastestInterval()
, stellt Ihre App daher alle 2 Minuten eine Anfrage .
Außerdem: Gibt es eine eingebaute Funktion zum Überprüfen der Standortaktualisierungen nur, wenn die Entfernungen der ersten Aktualisierung mit der zweiten Aktualisierung mehr als 20 Meter betragen?
Um alle 20 Meter eine Anfrage zu stellen, können Sie eine erstellen 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;
}
}
und in der ersten Anfrage setzen Sie das lat
und long
auf den aktuellen Ort (mit getLastLocation();
)
dann onLocationChanged()
holst du die Daten vom Objekt und vergleichst sie mit demnew Current Location
float distanceInMeters = distFrom((float)locationObj.getLatitude(), (float)locationObj.getLongitude(), (float)mCurrentLocation.getLatitude(), (float)mCurrentLocation.getLongitude())
mit dieser Funktion, die auch ein Vorschlag von Benutzern von ist SO
public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
double earthRadius = 6371;
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;
}