BroadcastReceiver и Activity LifeCycle

293
14 февраля 2017, 18:46

Есть некоторый BroadcastReceiver, который регистрируется в методе onStart активити и деактивируется (unregister) в методе onStop.

Есть сервис, который посылает интент, который должен поймать данный BroadcastReceiver и вывести данные из него в активити, полем класса которой он является.

Если сервис отошлет интент в момент поворота экрана, то есть в то время, когда ресивер деактивируется, но еще не зарегистрируется, то данные из сервиса до активити уже не дойдут (аналогичная ситуация произойдет, если в процессе загрузки информации пользователь банально свернет приложение).

Подскажите, пожалуйста, как правильно обработать эту ситуацию.

PS. Может быть, в этом случае подойдет как-либо другой способ коммуникации между сервисом и активити. Если быть более конкретным и упросить задачу, то она выглядит так:

В активити нажимаем кнопку, запускается сервис, который загружает текст из интернета и отдает этот текст обратно в активити, в которой он отображается. Главная цель - гарантированно доставить данные из сервиса до активити.

Задача довольно распространенная, уверен, что многие ее уже решали, но почему-то не могу найти хорошего решения.

Answer 1

Ну, вы можете ресивер не в активити подключать и содержать, а в фрагменте с setRetainInstance(true); - это команда будет препятствовать пересозданию фрагмента при поворотах экрана. Это рекомендуемая гуглом практика для храняния данных в активити. Думаю и для вашей задачи это решение подойдёт

Вам, в общем, надо хранить где-то состояние (например да, в сервисе или фрагменте этом) и при воостановлении активити это состояние отображать. Вообще для этого всего есть архитекурное решение типа MVP MVC etc). Его можно самостоятельно реализовать или либы юзать. Mosby, Moxy, много их. Суть такова - актвити при восстановлении запрашивает сервис/презентер/синглтон а текущем состоянии (данные есть/нет/в процессе загрузки) и отображает состояние. При этом сущность для хранения состояния, конечно, не должна уничтожаться при повороте. Такой сущностью может быть помянутый выше фрагмент, синглтон, сервис, презентер. Серебряной пули нет. Модно сейчас MVP подход использовать. Лично я Mosby либу использую. В презентере состояние - в методах жизненного цикла активити запрашиваю у презентера его и отображаю.

READ ALSO
Как создать свой браузер с возможностью скачивания видео с любого сайта?

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

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

318
SQLite. Запрос на одну запись по ее ID

SQLite. Запрос на одну запись по ее ID

Как в android выводить в ListView только одну строку из базы данных? Может запрос какой есть по _id или еще что-то?

314
Более чёткий график на java

Более чёткий график на java

Пишу приложение на Java (сторонние библиотеки не предлагайте, пожалуйста), нужно нарисовать график вводимой с клавиатуры функцииПользовался...

372