BroadcastReceiver — это класс в Android, который позволяет приложениям получать уведомления о системных событиях или событиях, создаваемых (другими) приложениями. Эти события называются широковещательными сообщениями.
Широковещательные сообщения могут быть отправлены любым приложением на устройстве, и все приложения, которые зарегистрировались для приема этих сообщений, получат уведомление. Это позволяет приложениям обмениваться информацией друг с другом и с системой Android. BroadcastReceiver является частью архитектуры событийно-ориентированного программирования в Android. Он позволяет приложению реагировать на различные события, такие как изменения состояния устройства, приход нового сообщения или завершение процесса.
Чтобы использовать BroadcastReceiver, необходимо создать класс, который расширяет основной класс. В этом классе необходимо определить метод onReceive()
, который будет вызываться, когда приложение получит широковещательное сообщение. В этом методе можно выполнить любые действия, необходимые в ответ на сообщение.
Вот пример класса:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Действия, выполняемые в ответ на широковещательное сообщение } }
Чтобы зарегистрировать BroadcastReceiver, необходимо вызвать метод registerReceiver()
. Этот метод принимает два параметра: контекст приложения и экземпляр класса.
Вот пример регистрации BroadcastReceiver:
MyReceiver receiver = new MyReceiver(); registerReceiver(receiver, new IntentFilter("my_broadcast_action"));
Чтобы отменить регистрацию BroadcastReceiver, необходимо вызвать метод unregisterReceiver().
Вот пример отмены регистрации BroadcastReceiver:
unregisterReceiver(receiver);
Вот некоторые примеры широковещательных сообщений, которые могут быть отправлены:
- Изменение уровня заряда батареи
- Подключение или отключение устройства к сети Wi-Fi
- Изменение громкости звука
- Запуск приложения
- Приход SMS
- События внутри самого приложения
- Коммуникация между его компонентами
Вот некоторые примеры того, как можно использовать BroadcastReceiver:
- Отслеживать изменения уровня заряда батареи и отображать уведомление, когда батарея разряжена.
- Отслеживать подключение или отключение устройства к сети Wi-Fi и изменять настройки приложения в зависимости от подключения.
- Отслеживать изменение громкости звука и обновлять индикатор громкости.
- Отслеживать запуск приложения и выполнять какие-либо действия при запуске.
Когда нельзя использовать BroadcastReceiver
BroadcastReceiver в Android удобен для обработки широковещательных сообщений, но есть ситуации, когда его использование не рекомендуется или вовсе невозможно:
1. Когда требуется длительная обработка
-
BroadcastReceiver
должен выполнять операции быстро (до 10 секунд). Если работа занимает больше времени, система может убить процесс. -
Альтернатива: Запускайте
JobIntentService
,WorkManager
илиForeground Service
.
2. Когда требуется обработка в фоне на Android 8+ (Oreo и выше)
-
С Android 8 (API 26)
BroadcastReceiver
для большинства implicit broadcasts (неявных широковещаний) не работает, если приложение не активно. -
Альтернатива: Используйте
JobScheduler
,WorkManager
илиForeground Service
.
3. Для обработки событий после завершения работы приложения
-
BroadcastReceiver
удаляется из памяти, если приложение выгружено из RAM, поэтому не подходит для долгосрочного мониторинга событий. -
Альтернатива: Используйте
WorkManager
сPeriodicWorkRequest
.
4. Когда нужна высокая надежность (например, важные системные события)
-
Если устройство перегружено, система может откладывать обработку
BroadcastReceiver
или вовсе не вызывать его. -
Альтернатива: Используйте
Foreground Service
, который менее подвержен ограничению работы.
5. Для частых обновлений UI
-
BroadcastReceiver
не предназначен для частого обновления интерфейса, так как это может привести к лагам. -
Альтернатива: Используйте
LiveData
,Flow
илиHandler
вViewModel
.
6. Когда обработка требует интерактивного взаимодействия с пользователем
-
BroadcastReceiver
работает в фоновом режиме и не может напрямую запускать UI-компоненты (например,Activity
). -
Альтернатива: Используйте
PendingIntent
для запуска активностей через уведомления.
Если вам нужен фоновый процесс, который работает стабильно на всех версиях Android, лучше использовать WorkManager
, Foreground Service
или JobScheduler
, а BroadcastReceiver
применять только для легковесных задач, таких как реагирование на BOOT_COMPLETED
или CONNECTIVITY_CHANGE
.
Другие вопросы с собеседований.