Состояние рабочей очереди IntentService

Я разрабатываю приложение для Android, которое запускает серию асинхронных сканирований датчиков, таких как получение списка MAC-адресов ближайших устройств Bluetooth, получение текущего местоположения телефона (GPS) и запись звукового образца окружающего шума. Всякий раз, когда каждое сканирование завершается, я хочу, чтобы служба обрабатывала отправку собранных данных в веб-службу (используя http и REST).

Вопрос, с которым я столкнулся, заключается в том, должен ли я реализовать свою собственную службу или использовать IntentServce для обработки нескольких запросов (намерения, отправленные с помощью startService()) для загрузки данных, потому что я хочу быть на 100% уверен, что найденные данные в конечном итоге отправляется на веб-сервис (если интернет-соединение становится доступным).

Если Android решит убить мой IntnetService или пользователь принудительно убьет его, все еще обрабатывая его рабочую очередь запросов, потеряю ли я очередь ожидающих запросов? т.е. мне нужно будет сохранять состояние рабочей очереди (и, следовательно, быть вынужденным реализовать Сервис самостоятельно без использования IntentService)?


person Rabie Jradi    schedule 06.06.2012    source источник


Ответы (1)


Если Android решит убить мой IntnetService или пользователь принудительно убьет его, все еще обрабатывая его рабочую очередь запросов, потеряю ли я очередь ожидающих запросов?

Ваша очередь испарится, если пользователь перезагрузит свое устройство. В противном случае, по крайней мере теоретически, возврат START_REDELIVER_INTENT из onStartCommand() (который является IntentService IIRC по умолчанию) должен дать вам любые Intent команды, которые не были обработаны.

При этом, если вы «хотите быть на 100% уверены», что команды обрабатываются, я предлагаю вам создать собственную долговременную рабочую очередь (например, таблицу базы данных). Используйте IntentService more в качестве запроса для обработки всех невыполненных событий очереди устойчивых работ (если таковые имеются). Используйте BOOT_COMPLETED BroadcastReceiver для обработки случая перезагрузки, сказав вашему IntentService обработать любые команды, оставшиеся невыполненными из-за перезагрузки.

person CommonsWare    schedule 06.06.2012
comment
Большое спасибо за этот быстрый и полезный ответ! Я понимаю, что недостаточно хорошо прочитал документацию по Службам, потому что не знал о START_REDELIVER_INTENT и об использовании IntentService. - person Rabie Jradi; 06.06.2012