Доступ к данным о местоположении в фоновом режиме может значительно сократить время работы от батареи. 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(), чтобы экономить заряд батареи. Рекомендуется задать значение не менее пяти минут.
Дополнительные ресурсы
Подробная информация доступна в Справочном центре:
- Рекомендации. В этом руководстве приведены конкретные рекомендации, которые помогут вам снизить влияние приложения на время работы от батареи.
- Примеры использования. В этом руководстве приведено несколько распространенных примеров использования сервисов геолокации и описано, как оптимизировать расход заряда батареи в этих случаях.