Эффективное использование LocationManager в Android

Я пытаюсь оптимизировать приложение для Android, которое должно достичь следующего:

  • Каждый час получать местоположение GPS и doSomeWork ()

  • В любое другое время, если устройство перемещается более чем на @MINIMUM_DISTANCE, увеличьте частоту обновления примерно до 5 минут, чтобы зарегистрировать движение, когда движение закончится, мы сможем вернуться к ежечасным обновлениям.

Теперь, если AlarmManager запускается каждый час, это удовлетворяет первое требование. Это отличный способ эффективно справиться с этой задачей. Однако я не уверен, как лучше всего выполнить второе требование.

Нужно ли мне:

  • Зарегистрировать AlarmManager, который срабатывает каждые 5 минут вместе с почасовым таймером? Зарегистрируйте LocationManager каждый раз и попытайтесь определить местоположение, сравните его с предыдущим местоположением, чтобы определить, произошло ли движение.

  • Зарегистрируйте LocationManager после моего ежечасного пробуждения с параметром минимального расстояния, равным моему требуемому минимальному перемещению.

  • Что-то другое?

Я вижу плюсы и минусы каждого подхода.

Использование параметра минимального расстояния LocationManager кажется мне более кратким решением, но меня беспокоит разрядка батареи. Будет ли это поддерживать работу GPS постоянно, независимо от того, получает ли мое приложение обновления? Я также не уверен, где лучше всего зарегистрировать приемник, я понимаю, что это плохая практика (не говоря уже о почти невозможной), чтобы служба работала 100% времени.

Да, я новичок в Android! Собираемся пойти и протестировать поведение LocationManager.

Заранее спасибо.


person Dan Wray    schedule 13.07.2012    source источник


Ответы (2)


Мое решение, которое работает хорошо, состоит в том, чтобы зарегистрировать NETWORK_PROVIDER (и PASSIVE на случай, если я смогу получить некоторые обновления бесплатно) и слушать в любое время, когда GPS_PROVIDER не работает. Если движение наблюдается за пределами ранее полученного местоположения, я могу переключиться на полный GPS, чтобы отслеживать движение.

Точность плохая, но, по крайней мере, достаточно хорошая. Расход заряда батареи очень низкий.

person Dan Wray    schedule 31.07.2012
comment
Я думаю, что это действительно отличный ответ. Я боролся с тем, как получить предупреждение на основе пройденного расстояния. - person Richard Le Mesurier; 14.08.2012
comment
Имейте в виду, что сетевой прослушиватель может дать вам очень ненадежные результаты, например, у меня были предупреждения о том, что я нахожусь в 15 км от моего предыдущего местоположения с заданной точностью 1,5 км, хотя на самом деле я вообще не двигался. В своем приложении я всегда дважды проверяю у истинного провайдера GPS, чтобы убедиться, было ли исправление в какой-то мере правильным. - person Dan Wray; 14.08.2012
comment
Вчера у меня был похожий опыт в моей гостиной, когда NetworkProvider отправлял меня в путешествие по дороге. Я тоже не двинулся. - person Richard Le Mesurier; 15.08.2012

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

Однако, если вам действительно нужны обновления только раз в 5 минут, я определенно воспользуюсь методом AlarmManager, поскольку это гарантирует, что вы не будете ничего делать с GPS между 5-минутными интервалами.

Однако имейте в виду, что GPS может занять некоторое время, чтобы получить исправление, если пользователь переместился, а GPS не был включен. Так что не ожидайте, что вы сможете получить точное исправление сразу после включения GPS.

person David Wasser    schedule 13.07.2012
comment
Это как раз проблема с методом AlarmManager и причина, по которой я бы предпочел иметь возможность постоянно регистрировать LocationManager, однако я не уверен, возможен ли такой подход с точки зрения времени автономной работы PoV. Это приложение должно быть активным как можно ближе к 100% времени включения устройства, поэтому меня очень беспокоит влияние батареи. - person Dan Wray; 13.07.2012
comment
Я бы хотел сохранить регистрацию LocationManager для обнаружения движения, затем удалить его и вернуться к пятиминутным сигналам тревоги для фактического отслеживания. Мне он действительно нужен только для того, чтобы уведомление о начале движения, остальное я справлюсь. - person Dan Wray; 13.07.2012
comment
Я бы посоветовал вам действительно проверить это. Реализуйте оба варианта, добавьте ведение журнала для определения разряда батареи и используйте его в условиях раллийного мира. Тогда сравните. После этого вы сможете принять решение на основе эмпирических данных. Настоящая проблема здесь в том, что все производители телефонов реализуют свои собственные низкоуровневые системы GPS, поэтому трудно точно узнать, как это реализовано, не протестировав их самостоятельно. - person David Wasser; 15.07.2012
comment
Действительно, спасибо за ваши комментарии. Я проводил собственные тесты батареи, так как подозревал, что регистрация приемника GPS даже при разумном минимальном расстоянии и параметрах времени разряжает батарею до полного разряда в течение 12 часов на модели, с которой я работаю (Samsung Galaxy Ace). У меня был некоторый успех в использовании прослушивателя NETWORK для уведомления о моем движении, так как использование батареи при этом значительно сокращается. Я заметил, что в документации к последнему обновлению ОС производители теперь обязаны правильно указывать минимальное время и расстояние - долгожданное изменение. - person Dan Wray; 16.07.2012
comment
-1: проблема с LocationManager в том, что он не предлагает метода ТОЛЬКО проверки расстояния. Он проверит расстояние И время. Таким образом, он не будет предупреждать вас, когда вы продвинулись достаточно далеко, ДО ТОГО, КАК ПРОШЛО ВРЕМЯ. - person Richard Le Mesurier; 14.08.2012