Что такое BroadcastReceiver?

BroadcastReceiver в Android — это компонент, который позволяет приложению реагировать на широковещательные сообщения (broadcasts), отправленные как системой, так и другими приложениями.

Это один из четырёх основных компонентов Android (наряду с Activity, Service и ContentProvider) и используется для прослушивания событий, происходящих в системе или приложении.

📡 Что такое broadcast

Broadcast — это событие, которое может быть разослано всем заинтересованным приложениям. Примеры системных broadcast-событий:

  • android.intent.action.BOOT_COMPLETED — устройство завершило загрузку.

  • android.intent.action.AIRPLANE_MODE — включён/выключен авиарежим.

  • android.net.conn.CONNECTIVITY_CHANGE — изменение состояния сети.

  • android.intent.action.BATTERY_LOW — низкий заряд батареи.

🔧 Как создать BroadcastReceiver

1. Создание класса:

class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (action == Intent.ACTION_BATTERY_LOW) {
// Реагируем на низкий заряд батареи
}
}
}

2. Регистрация

✅ Динамическая регистрация (в коде)

val receiver = MyReceiver()
val filter = IntentFilter(Intent.ACTION_BATTERY_LOW)
registerReceiver(receiver, filter)

Регистрация обычно происходит в onStart()/onResume(), а отмена — в onStop()/onPause():

unregisterReceiver(receiver)

📝 Статическая регистрация (в манифесте)

<receiver android:name=".MyReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

⚠️ С Android 8.0 (API 26) многие системные broadcast нельзя регистрировать в манифесте, если приложение не запущено. Их нужно регистрировать только программно (динамически).

📤 Отправка broadcast-сообщений

Локально внутри приложения:

val intent = Intent("com.example.MY_EVENT")
LocalBroadcastManager.getInstance(context).sendBroadcast(intent)

⚠️ LocalBroadcastManager устарел, вместо него лучше использовать Flow, SharedFlow или LiveData в современных проектах.

Глобально (системно):

val intent = Intent("com.example.MY_GLOBAL_EVENT")
sendBroadcast(intent)

🧠 Примеры использования

  • Реакция на смену сети (Wi-Fi, мобильная сеть).

  • Получение информации при загрузке устройства.

  • Слушание Bluetooth-событий.

  • Получение SMS/MMS (при наличии разрешений).

  • Внутреннее событие между компонентами приложения.

⚠️ Важные особенности

  • onReceive() выполняется быстро (в основном потоке) — нельзя запускать долгие операции или блокирующий код.

  • Для тяжёлых задач — запускай JobIntentService, Service или используй WorkManager.

  • Broadcast можно сделать:

    • нормальным — получатель просто реагирует.

    • ordered (упорядоченным) — приоритетные приёмники получают первым, можно прервать дальнейшую рассылку.

    • sticky (устарело) — сообщение сохраняется системой (например, BATTERY_CHANGED).

✅ Когда использовать BroadcastReceiver

  • Хочешь реагировать на системные события (батарея, сеть, загрузка).

  • Нужно настроить внутреннюю коммуникацию между частями приложения.

  • Обрабатываешь события даже при закрытом UI (но приложение должно быть запущено).

🗂 Альтернативы в современной архитектуре

  • LiveData, SharedFlow и StateFlow — для внутренних событий.

  • WorkManager — для фона и отложенных задач.

  • EventBus/RxJava/Coroutine Channel — для сложной логики и архитектурных решений.

Таким образом, BroadcastReceiver — это механизм подписки на события, позволяющий реагировать на изменения внутри системы или приложения. Он особенно полезен при создании приложений, зависящих от внешних условий, таких как сеть, заряд, загрузка устройства и т.д.