BroadcastReceiver можно зарегистрировать статически и динамически.

Статическая регистрация – это добавление элемента <receiver> в AndroidManifest.

<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.LOCALE_CHANGED"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>


Элемент <intent-filter> объявляет действия (<action>) на которые реагирует BroadcastReceiver. Система регистрирует ресиверы, прописанные в манифесте и вызывает их независимо от того запущено приложение или нет.

Динамическая регистрация – это регистрация на контексте в коде приложения. Выполняется методом context.registerReceiver(receiver: BroadcastReceiver, intentFilter: IntentFilter). Этот метод принимает параметром объект класса IntentFilter, который определяет на какие действия будет реагировать зарегистрированный ресивер.

val receiver: BroadcastReceiver = MyBroadcastReceiver()
val filter = IntentFilter().apply {
addAction(ConnectivityManager.CONNECTIVITY_ACTION)
addAction(Intent.LOCALE_CHANGED)
addAction("my_custom_action")
}
context.registerReceiver(receiver, filter)


Для разрегистрации динамических ресиверов используется метод context.unregisterReceiver(receiver: BroadcastReceiver).

Ресиверы, зарегистрированные динамически, живут не дольше чем объект context, на котором они зарегистрированы. Если метод registerReceiver() вызывается на активити, то ресивер будет получать события, пока система не уничтожит активити. Если вызвать registerReceiver() на application context, то ресивер останется зарегистрированным, пока запущено приложение. Пост о различии activity и application контекстов.