Регистрировать BroadcastReceiver только во время жизненного цикла процесса

Я столкнулся с этой проблемой дизайна. У меня есть приложение, которое отображает список mp3, которые пользователь может просто воспроизвести онлайн или загрузить для локального воспроизведения. Теперь я хочу добавить в макет строки представления списка зеленую галочку, если файл был загружен. Для этой цели в классе модели я добавил поле с именем isDownloaded(), которое инициализируется, когда класс загрузчика загружает из xml-файла список mp3, затем проверяет, существуют ли они в файловой системе, и соответствующим образом устанавливает значение isDownloaded(). Данные загружаются один раз при запуске процесса приложения и сохраняются во время изменения конфигурации, чтобы не перезагружать их. Теперь возникает проблема: я загружаю файлы с помощью системного менеджера загрузки, который запускает намерение, когда файл завершает загрузку. Чтобы обновить список, я регистрирую BroadcastReceiver во время onStart() и отменяю его регистрацию во время onStop(), поэтому, если загрузка завершается, когда активность пользователя находится на переднем плане, список обновляется. Но что, если активность находится в фоновом режиме и процесс не был уничтожен? Намерение завершения загрузки теряется, и когда пользователь возвращается к действию, пользовательский интерфейс не будет обновляться, поскольку модель не была обновлена. Очевидно, что мне нужно что-то еще, поэтому, когда пользователь не взаимодействует с активностью, модель обновляется, и когда пользователь возвращается, активность перекрашивает список во время onStart(). Регистрация BroadcastReceiver в манифесте не кажется решением, потому что, если процесс уже был убит на момент окончания загрузки, нет необходимости снова запускать процесс и обновлять модель (которая, очевидно, даже не будет загружена). Буду признателен за любые идеи или советы по дизайну, большое спасибо.


person Quark    schedule 08.04.2015    source источник


Ответы (2)


Не сработает ли простое перемещение регистрации/отмены регистрации в onCreate и onDestroy?

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

person cYrixmorten    schedule 08.04.2015
comment
Спасибо за Ваш ответ. Регистрация во время onCreate() не решит проблему, потому что активность может быть уничтожена, но процесс не будет, поэтому вы окажетесь в той же ситуации. Я думаю, что поддержка базы данных/файла является излишним для этого простого приложения. Загрузчик просто проверяет, существует ли файл, и устанавливает модель при загрузке. Мне нужен какой-то способ обновить уже загруженные данные (помните, что массив mp3 загружается только один раз, когда создается класс загрузчика), которые являются общими для всего приложения. - person Quark; 09.04.2015

Ответ заключается в регистрации BroadcastReceiver в классе приложения во время onCreate() с использованием контекста приложения. Таким образом, BroadcastReceiver активен, пока процесс приложения жив.

person Quark    schedule 12.04.2015