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