Действительно ли провайдер определения местоположения разряжает батарею?

Мне нужно реализовать службу на основе местоположения. Мне не нужно точное местоположение, поэтому GPS не нужен.

Проще всего было бы начать слушать обновления местоположений при запуске приложения и оставить его включенным:

    mLocationMgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 100, mPendingIntent);

Поскольку мне не нужна большая точность, я установил максимальную частоту обновлений на 10 с и 100 м вместо 0, 0 по умолчанию.

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


person gpo    schedule 20.01.2012    source источник
comment
Ну, вы всегда можете написать тест. Используйте сервисы, основанные на местоположении, для обоих способов и делайте это по часу каждый. Затем посмотрите, какова разрядка батареи для каждого из них.   -  person JPM    schedule 21.01.2012
comment
У меня нет статистики, подтверждающей мои мысли по этому поводу. Так что принимайте его за то, что он стоит. Но я думаю да, при этом это не будет так сильно разряжать батарею, как если бы вы использовали gps и установили время и близость на минимум. Это все равно будет заметно истощать батарею по сравнению с тем, чтобы вообще этого не делать. Мой опыт работы с ним исключительно с точки зрения пользователя, я не создал ничего, что бы его использовало. Отличный совет JPM, если вы собираетесь это сделать, проверьте приложение Battery Graph на рынке. Подойдет для такого теста.   -  person FoamyGuy    schedule 21.01.2012


Ответы (2)


Ваш 100-метровый фильтр мало что даст вам с точки зрения разряда батареи. Это будет контролировать только то, сколько раз ваш PendingIntent будет выполняться из-за исправлений.

Ваше 10-секундное значение времени может использоваться ОС для управления энергопотреблением, но это не гарантируется. И с таким низким значением кажется маловероятным, что он будет использоваться. Каждый час, может быть, но не каждые 10 секунд.

Самое главное, что вам нужно будет постоянно держать процессор включенным. И, поскольку вы используете вариант PendingIntent requestLocationUpdates(), я предполагаю, что вы планируете собирать данные в течение длительного времени.

Если у вас есть только разрешение COARSE, Android, надеюсь, избегает обнаружения близости к точке доступа Wi-Fi, что сэкономит немного энергии.

В целом сетевой провайдер будет потреблять меньше энергии, чем провайдер GPS. «Меньше» — это далеко не «мало». На Android-устройстве класса Nexus GPS + CPU дают мне несколько часов автономной работы (согласно данным с помощью Google Navigation). Я ожидаю, что сетевой провайдер + ЦП проработает на несколько часов дольше, но это все, потому что ЦП сам по себе является довольно значительным расходом заряда батареи.

Больше всего меня беспокоит:

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

Похоже, вы на самом деле не планируете удалять обновления своего местоположения. Это действительно плохая идея с любым провайдером (кроме может быть пассивного провайдера). У вас должен быть более конкретный план регистрации и удаления обновлений. В частности, убедитесь, что у пользователя есть возможность контролировать, когда вы потребляете заряд батареи до такой степени.

person CommonsWare    schedule 20.01.2012

Об этом есть тема в Руководстве для разработчиков Android. Я бы порекомендовал вам взглянуть на примеры кода на странице.

Это то, что они упоминают в отношении экономии заряда батареи и различных параметров.

Настройка модели для экономии батареи и обмена данными

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

Меньшее окно, в котором вы прослушиваете обновления местоположения, означает меньшее взаимодействие с GPS и сетевыми службами определения местоположения, что позволяет экономить заряд батареи. Но это также позволяет использовать меньше местоположений, из которых можно выбрать наилучшую оценку. Настройте провайдеров местоположения так, чтобы они возвращали обновления реже

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

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

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

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

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

Изменить. Существует способ определить энергопотребление для различных LocationProviders!

Вызов getPowerRequirement () для LocationProvider вызовет возвращает одну из трех констант.

int     POWER_HIGH  A constant indicating a high power requirement.
int     POWER_LOW   A constant indicating a low power requirement.
int     POWER_MEDIUM    A constant indicating a medium power requirement.

Чтобы сделать ваш код более читабельным, изучите использование meetsCriteria (Criteria criteria) в любых логических проверках, чтобы сделать ваш код более читабельным.

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

person Devin M    schedule 20.01.2012
comment
Да, я прочитал весь этот учебник перед публикацией в stackoverflow :-). Меня беспокоило то, что они не делают различий между провайдерами определения местоположения GPS и сетью, когда дело доходит до разрядки батареи. - person gpo; 21.01.2012
comment
Я включил свой последний комментарий в ответ, посмотрите редактирование внизу и дайте мне знать, если он ответит на ваш вопрос. - person Devin M; 21.01.2012