О доступе к данным о местоположении в фоновом режиме и времени работы от батареи

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

Ограничения на доступ к данным о местоположении в фоновом режиме

  • Доступ к данным о местоположении в фоновом режиме ограничен, а местоположение вычисляется и передается только несколько раз в час.
  • Сканирование сетей Wi-Fi выполняется реже, а уведомления о местоположении не отправляются, если устройство подключено к одной и той же статической точке доступа.
  • Время отклика геозоны увеличивается с десятков секунд до примерно двух минут. Это изменение улучшает производительность батареи – на некоторых устройствах до 10 раз.

Необходимые знания

Для работы с этим документом необходимо знать следующие API:

  • Геолокация Google. Эти API обеспечивают более высокую точность и меньше разряжают батарею, чем Location API фреймворка.
  • Fused Location Provider. Этот API объединяет сигналы GPS, Wi-Fi и мобильных сетей, а также акселерометра, гироскопа, магнитометра и других датчиков.
  • Geofencing API. Этот API создан на основе Fused Location Provider API и оптимизирован для экономии заряда батареи.

Как понять, что батарея разряжается слишком быстро

Сбор данных о местоположении и расход заряда батареи связаны следующим образом:

  • Точность. Точность данных о местоположении. Как правило, чем выше точность, тем быстрее разряжается батарея.
  • Частота. Как часто определяется местоположение. Чем чаще определяется местоположение, тем быстрее разряжается батарея.
  • Задержка. Как быстро передаются данные о местоположении. Чем меньше задержка, тем больше энергии требуется.

Точность

Точность геолокации можно указать с помощью метода setPriority(), передав в качестве аргумента одно из следующих значений:

  • PRIORITY_HIGH_ACCURACY обеспечивает максимально точное определение местоположения, которое вычисляется с использованием всех необходимых входных данных (включает GPS, Wi-Fi и мобильную сеть, а также использует различные датчики). Это может привести к значительному расходу заряда батареи.
  • PRIORITY_BALANCED_POWER_ACCURACY точно определяет местоположение и оптимизирует энергопотребление. GPS используется очень редко. Обычно для определения местоположения устройства используются данные Wi-Fi и мобильной сети.
  • PRIORITY_LOW_POWER в основном использует вышки сотовой связи и не использует GPS и Wi-Fi. Это позволяет определять местоположение с низкой точностью (на уровне города) и минимальным расходом заряда батареи.
  • PRIORITY_PASSIVE пассивно получает данные о местоположении от других приложений, для которых оно уже было определено.

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

Частота

Указать частоту определения местоположения можно двумя способами:

  • Используйте метод setIntervalMillis(), чтобы указать интервал для вычисления местоположения приложения.
  • Используйте метод setMinUpdateIntervalMillis(), чтобы указать интервал получения данных о местоположении от других приложений.

При использовании setIntervalMillis() передавайте максимально возможное значение. Это особенно важно для доступа к данным о местоположении в фоновом режиме, который часто приводит к быстрой разрядке батареи. Для активных служб зарезервируйте интервалы в несколько секунд.

Ограничения на доступ к данным о местоположении в фоновом режиме, введенные в Android 8.0 (уровень API 26), обеспечивают соблюдение этих стратегий, но ваше приложение должно стремиться к их соблюдению на устройствах под управлением Android 7.0 (уровень API 24) и ниже.

Задержка

Задержку можно задать с помощью метода setMaxUpdateDelayMillis(). Обычно передается значение, которое в несколько раз больше интервала, указанного в методе setIntervalMillis(). При этом уведомления о местоположении могут приходить с задержкой и сразу по несколько штук. Эти два изменения помогают минимизировать расход заряда батареи.

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

При использовании геозон приложения должны передавать большое значение в метод setNotificationResponsiveness(), чтобы экономить заряд батареи. Рекомендуется задать значение не менее пяти минут.

Дополнительные ресурсы

Подробная информация доступна в Справочном центре:

  • Рекомендации. В этом руководстве приведены конкретные рекомендации, которые помогут вам снизить влияние приложения на время работы от батареи.
  • Примеры использования. В этом руководстве приведено несколько распространенных примеров использования сервисов геолокации и описано, как оптимизировать расход заряда батареи в этих случаях.