Разница между LocationRequest setInterval (long millis) и LocationRequest setFastestInterval (long millis)

Я пишу свои собственные обновления фона для интервалов каждые 5 минут в android. Я хотел бы знать разницу между setInterval и setFastestInterval

Когда я устанавливаюInterval на 5 минут и setFastestInterval на 2 минуты. Обновление местоположения вызывается каждые 2 минуты.

Я хотел бы знать разницу. Я не мог понять, что именно написано на странице разработчика для https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html

Также: существует ли встроенная функция для проверки обновлений местоположения только в том случае, если расстояния до первого обновления превышают 20 метров при втором обновлении?

Спасибо!

Ответ 1

посмотрев ссылку 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 секунд. Если другое приложение использует службы определения местоположения с более высокой скоростью обновления, вы получите больше обновлений местоположения.

Я считаю, что это хорошо влияет на срок службы аккумулятора, потребляемого вашим приложением, вы определяете максимальный период времени, который вы можете ожидать, говоря, что если обновление доступно, вы хотите его. Потребление батареи будет зачислено в приложение, которое запрашивает более частые обновления, а не ваши.

Ответ 2

Я пишу свои собственные обновления фона для интервалов каждые 5 минут в android. Я хотел бы знать разницу между setInterval и setFastestInterval

Предположим, что setFastestInterval(); имеет более высокий приоритет для запроса Location. В любое приложение, которое вы установили setFastestInterval();, это будет первое приложение, которое будет выполнено (даже если другие приложения используют LocationServices).

ex: Если APP1 имеет setFastestInterval(1000 * 10) и APP2 имеет setInterval(1000 * 10), оба APPS имеют одинаковый интервал запросов. Но именно APP1 сделает первый запрос. (это то, что я понял, ответ неправильный, может быть)

Когда я setInterval до 5 минут и setFastestInterval до 2 минут. location update вызывается каждые 2 минуты.

Если вы используете 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

Также: существует ли встроенная функция для проверки обновлений местоположения только в том случае, если расстояние до первого обновления превышает 20 метров со вторым обновлением?

В LocationRequest есть метод, который вы можете использовать для установки минимального расстояния между обновлениями.

int minimumDistanceBetweenUpdates = 20;

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