Использование WakefulIntentService для управления асинхронными обновлениями GPS

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

Очевидно, мне нужно, чтобы прослушиватель местоположения GPS работал в службе, и мне также понадобится частичная блокировка пробуждения, чтобы он мог запускаться время от времени, когда телефон спит. Я также хочу, чтобы обновления GPS менялись по частоте в зависимости от расстояния от платного моста для экономии заряда батареи. Служба cwac-WakefulIntent кажется идеальной для того, чего я пытаюсь достичь.

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

Выходит ли служба WakefulIntent и освобождает wakelock после завершения doWakefulWork(), даже если я жду, пока мой прослушиватель местоположения вернет некоторые обновления GPS.

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

Что произойдет, если я все еще ожидаю обновления GPS, когда диспетчер тревог снова запускает службу, то есть до завершения doWakefulWork()?

Как сохранить данные между экземплярами службы. Могу ли я вставить массив координат GPS в SharedPrefs?

Наконец, когда я приближаюсь к платному мосту, мне нужно больше частых обновлений GPS. Управляю ли я этим с помощью doWakefulWork() или изменяя scheduleAlarms() так, чтобы он использовал setRepeating() с количеством минут, хранящихся в SharedPrefs службой. Идея здесь состоит в том, чтобы ограничить использование GPS в зависимости от близости к интересующей области.

Хотя демонстрационное приложение предоставляет шаблон для работы, мне не удалось найти надежных примеров того, как WakefulIntentService выполняет какие-либо асинхронные задания.


person user1325094    schedule 15.04.2012    source источник


Ответы (1)


Служба cwac-WakefulIntent кажется идеальной для того, чего я пытаюсь достичь.

Не совсем. IntentService не подходит для отслеживания местоположения, потому что вы не можете зарегистрировать слушателя. Служба будет закрыта после окончания onHandleIntent().

Лично я бы использовал addProxmityAlert() на LocationManager, а не возился со всем этим самостоятельно.

Выходит ли служба WakefulIntent и освобождает wakelock после завершения doWakefulWork(), даже если я жду, пока мой прослушиватель местоположения вернет некоторые обновления GPS.

да.

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

Вы не знаете. Вы используете что-то другое, например LocationPoller или, что еще лучше, addProximityAlert().

Что произойдет, если я все еще ожидаю обновления GPS, когда диспетчер тревог снова запускает службу, то есть до завершения doWakefulWork()?

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

Как сохранить данные между экземплярами службы. Могу ли я вставить массив координат GPS в SharedPrefs?

Да или базу данных, или файл в выбранном вами формате.

Наконец, когда я приближаюсь к платному мосту, мне нужно больше частых обновлений GPS. Управляю ли я этим с помощью doWakefulWork() или изменяя scheduleAlarms() так, чтобы он использовал setRepeating() с количеством минут, хранящихся в SharedPrefs службой.

Вы бы изменили расписание будильника.

Мне не удалось найти убедительных примеров того, как WakefulIntentService выполняет какие-либо асинхронные задания.

WakefulIntentService является "асинхронным заданием". Он не выполняет другие асинхронные задания.

person CommonsWare    schedule 15.04.2012
comment
Спасибо. Указатели на doProximityAlert() указывают мне куда идти. Теперь мне просто нужно выяснить, как написать сервис с wakelock или использовать всегда работающий шаблон сервиса. - person user1325094; 16.04.2012