Обновление местоположения фона Android и Wakelock

Я работаю над приложением для Android, где мне нужно получать обновления местоположения в фоновом режиме в течение длительного периода времени с помощью поставщика GPS, поэтому мне нужно, чтобы обновления местоположения возникали, когда пользователь больше не взаимодействует с ним. Я провел некоторое собственное тестирование, сравнивая собственные запросы LocationManager requestSingleUpdate (поставщик, версия pendingIntent) и requestLocationUpdates (поставщик, minTime, minDistance, версия намерения). После получения большого количества данных на моем Droid Razr HD похоже, что использование requestLocationUpdates значительно более надежно, чем requestSingleUpdate (для обоих методов я фактически сравнил местоположение GPS, сообщенное там, где я на самом деле находился, то есть не использовал сообщенную точность, и requestLocationUpdates был не только значительно более точным в отношении моего фактического местоположения, но и возвращал время исправления местоположения, которое намного чаще совпадает с текущим временем, чем при использовании параметра requestSingleUpdate). Я знаю, как использовать AlarmManager с повторяющимся сигналом тревоги и вызывать requestSingleUpdate, так что мне нужно только удерживать будильник каждый раз, когда срабатывает будильник, но из-за повышенной точности использования requestLocationUpdates (по крайней мере, в моих тестах на моем телефоне) я хотел бы использовать этот метод вместо. Моя проблема в том, что, если я использую метод requestLocationUpdates, мне действительно непонятно, что мне нужно делать в плане удержания wakelock, чтобы обновления происходили, когда пользователь не взаимодействует с телефоном. Я вызываю requestLocationUpdates из отдельного потока, который запускается из службы (я читал, что это стандартный шаблон). Мой вопрос заключается в том, должен ли я удерживать блокировку в течение всего времени, когда я хочу, чтобы обновления местоположения продолжали поступать? Если я не получу свой собственный wakelock, обновления местоположения продолжают приходить, будить телефон для каждого нового обновления? Если это правда, создают ли эти обновления свой собственный wakelock, и если да, то когда они выпускают wakelock? Я не могу найти четкого ответа на этот вопрос. Любая помощь с благодарностью.

2 ответа

Нет, вам не нужен wakelock, потому что ОС берет на себя wakelock ( код). Wakelock освобождается, когда onLocationChange() заканчивается или когда ваш широковещательный получатель получает намерение (для намеренной версии интерфейса). Вам нужен свой собственный wakelock, если вы начинаете некоторую асинхронную работу в onLocationChange() например с другим потоком.

Я написал приложение для регистрации полетов, которое также необходимо обновлять каждые несколько секунд, чтобы распознавать взлеты и посадки. Полученные данные оцениваются в сервисе. Чтобы сохранить сервис, вам понадобится WakeLock. Я получаю блокировку при запуске детектора (автоматически распознающего соответствующие события) и снимаю блокировку, когда пользователь выключает детектор; это также время жизни службы, поэтому блокировка регистрируется в onCreate и освобождается в onDestroy. Я использую SCREEN_DIM_WAKE_LOCK, чтобы сэкономить энергию.

Другие вопросы по тегам