Выполните следующие действия, чтобы улучшить влияние вашего приложения на время автономной работы устройства при использовании служб определения местоположения.
Удалить обновления местоположения
Одной из распространенных причин ненужного расхода заряда батареи является несоблюдение требования об удалении обновлений местоположения, когда они больше не нужны.
Это может произойти, когда методы жизненного цикла onStart() или onResume() активности содержат вызов requestlocationUpdates() без соответствующего вызова removeLocationUpdates() в методах жизненного цикла onPause() или onStop() .
Вы можете использовать компоненты, учитывающие жизненный цикл, для более эффективного управления жизненным циклом действий в вашем приложении. Дополнительную информацию см. в разделе «Управление жизненным циклом с помощью компонентов, учитывающих жизненный цикл» .
Установить тайм-ауты
Чтобы предотвратить разрядку батареи, установите разумный тайм-аут, после которого обновления местоположения должны прекратиться. Тайм-аут гарантирует, что обновления не будут продолжаться бесконечно, и защищает приложение в ситуациях, когда обновления запрашиваются, но не удаляются (например, из-за ошибки в коде).
Для запроса к поставщику данных о местоположении добавьте тайм-аут, вызвав метод setDurationMillis() , который принимает параметр, представляющий время в миллисекундах с момента последнего вызова метода. Вы также можете использовать этот метод для выражения времени истечения срока действия в терминах длительности.
Чтобы добавить тайм-аут к запросу местоположения в геозоне, вызовите метод setExpirationDuration() .
Пакетные запросы
Для всех сценариев использования, не связанных с активным режимом, объединяйте несколько запросов в пакеты. Используйте метод setIntervalMillis() для указания интервала, с которым вы хотите вычислять местоположение. Затем используйте метод setMaxUpdateDelayMillis() для установки интервала, с которым местоположение будет передаваться в ваше приложение. Передайте методу setMaxUpdateDelayMillis() значение, кратное значению, переданному методу setIntervalMillis() . Например, рассмотрим следующий запрос местоположения:
Котлин
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build();
В этом случае система вычисляет местоположение примерно каждые десять минут и примерно раз в час предоставляет пакет из шести точек данных о местоположении. Хотя вы по-прежнему получаете обновления местоположения примерно каждые десять минут, вы экономите заряд батареи, поскольку ваше устройство включается только примерно раз в час.
Используйте пассивные обновления местоположения.
В фоновом режиме рекомендуется ограничивать скорость обновления данных о местоположении. В Android 8.0 (уровень API 26) это правило соблюдается, но приложениям, работающим на более старых устройствах, следует стремиться максимально ограничить обновление данных о местоположении в фоновом режиме.
Вполне вероятно, что пока ваше приложение работает в фоновом режиме, другое приложение может часто запрашивать обновления местоположения на переднем плане. Службы определения местоположения предоставляют эти обновления вашему приложению. Рассмотрим следующий запрос местоположения, который, по возможности, потребляет данные о местоположении:
Котлин
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build();
В предыдущем примере местоположение приложения вычисляется примерно каждые 15 минут. Если другие приложения запрашивают местоположение, приложение получает данные с максимальным интервалом в две минуты.
Хотя пассивное получение данных о местоположении не приводит к разрядке батареи, следует проявлять особую осторожность в случаях, когда получение данных о местоположении запускает ресурсоемкие операции процессора или ввода-вывода. Для минимизации затрат на заряд батареи интервал, указанный в setMinUpdateIntervalMillis() не должен быть слишком малым.