1. Обычный броадкаст. Для отправки броадкаст сообщения используется метод sendBroadcast(intent: Intent). Intent может явно определять ресивер, который получит сообщение:

val intent = Intent(MyBroadcastReceiver::class.java) 
context.sendBroadcast(intent)


В примере выше сообщение получит только MyBroadcastReceiver.

Если intent содержит action, то сообщение получат все ресиверы, зарегистрированные с соответствующим интент фильтром:

val intent = Intent("my_custom_action")
context.sendBroadcast(intent)


Этот интент получит ресивер, содержащий my_custom_action в IntentFilter. Пример такого ресивера.

Когда отправляется обычный броадкаст, порядок получения сообщений не определен. Ресиверы не могут изменять сообщение или останавливать броадкаст.

2. Упорядоченный броадкаст. Отправляется методом sendOrderedBroadcast(intent: Intent, permission: String). Сообщение принимается в порядке, заданном атрибутом priority объекта IntentFilter. Ресиверы с одинаковым приоритетом получают сообщение в произвольном порядке.
Когда отправляется упорядоченный броадкаст, ресиверы могут передавать данные (result сode / result data / result extras) следующим ресиверам или останавливать отправку.
Упорядоченные броадкасты разберем подробнее в следующих постах.

3. Локальный броадкаст. Отправляется методом LocalBroadcastManager.sendBroadcast(intent: Intent). Сообщения доставляются только тем ресиверам, которые зарегистрированны в этом же приложении. Отправка локальных броадкастов эффективнее, чем обычный броадкаст, т.к. не требуется коммуникация между процессами.