Без обид, но ваш вопрос все еще чертовски расплывчатый. Итак, я собираюсь обрисовать целый беспорядок сценариев и надеюсь, что один из них действительно решит любую проблему, которая, по вашему мнению, у вас есть.
Сценарий A: только действие
Если вам нужно получать трансляцию только тогда, когда у вас есть активность на переднем плане, зарегистрируйте активность на BroadcastReceiver
, используя registerReceiver()
. Как указано @MisterSquonk, вы должны зарегистрировать получателя в onResume()
и отменить его регистрацию в onPause()
.
Сценарий B: действие «Если на переднем плане», «Другое»; Заказанная трансляция
Если вы хотите, чтобы действие на переднем плане обрабатывало трансляцию, но вы хотите, чтобы что-то происходило, если это действие не на переднем плане (например, поднимите Notification
), и трансляция является упорядоченной трансляцией (например, входящая SMS), тогда вы все равно будете использовать решение сценария A, но с более высоким приоритетом IntentFilter
(см. setPriority()
). Кроме того, вы должны зарегистрировать BroadcastReceiver
через элемент <receiver>
в манифесте с более низким приоритетом <intent-filter>
для той же самой трансляции. В упражнении BroadcastReceiver
позвоните по номеру abortBroadcast()
, чтобы использовать событие и не дать ему достичь зарегистрированного манифеста BroadcastReceiver
.
Сценарий C: действие «Если на переднем плане», «Другое»; Обычная трансляция
Если сценарий B почти подходит, но трансляция, которую вы слушаете, не является заказанной трансляцией, вам нужно начать со сценария B. Однако, если трансляция, которую оба приемника имеют в своих соответствующих фильтрах, будет одной из ваших, используя личную строку действия, как предложено @MisterSquonk. Кроме того, еще один BroadcastReceiver
зарегистрирован в манифесте, чей <intent-filter>
предназначен для реального вещания, которое вы слушаете. Этот получатель просто позвонит по номеру sendOrderedBroadcast()
, чтобы отправить заказанное вещание, которое слушают другие получатели.
Сценарий D: деятельность независимо от переднего плана
Если какая-то ваша деятельность должна знать о трансляции, и не имеет значения, находится ли она на переднем плане, вам нужно переосмыслить то, что вы подразумеваете под этим. Обычно это действительно означает, что широковещательная рассылка влияет на вашу модель данных в некотором роде, и в этом случае ваша задача должна не сообщать действиям, а скорее обновить вашу модель данных и использовать уже существующую Логика «дайте действиям знать об изменении модели данных» обрабатывает все остальное.
Если, однако, вы уверены, что это не является частью вашей модели данных, вы можете реализовать Сценарий B или Сценарий C, а также вставить некоторую информацию в элемент статических данных. Ваши действия могут проверить этот элемент статических данных в onResume()
, чтобы получить информацию о трансляции, когда они возвращаются на передний план.
Если вы думаете «но, что если мой процесс будет прерван между трансляцией и другими действиями, выходящими на первый план?», То ваша трансляция действительно обновляет вашу модель данных, в соответствии с открытием абзац этого сценария.
Если вы думаете «но я хочу обновить действие, выполняющее работу в фоновом режиме», то рассматриваемое действие прерывается. Деятельность никогда не должна делать работу в фоновом режиме. Эту работу следует делегировать какой-либо форме службы, и существует целый ряд связанных сценариев для передачи широковещательной рассылки в службу.