Broadcast Receiver는 네트워크 상태 변화, 배터리 잔량, SMS 수신 또는 앱 설치와 같은 시스템 Broadcast 메시지를 수신하고 처리하는 Android 구성 요소입니다. 이벤트 발생 시 운영 체제에 의해 실행되며 메인 스레드 또는 백그라운드 서비스를 통해 작업을 수행합니다. Android Developer Guide, 2026에 따르면 Broadcast Receiver는 애플리케이션이 실행 중이 아니더라도 전역 시스템 이벤트에 반응할 수 있게 하여 Android 생태계에서 백그라운드 이벤트 처리를 위한 핵심 메커니즘입니다.
핵심 사항
Broadcast Receiver는 운영 체제나 다른 애플리케이션에 의해 배포되는 Intent 메시지를 수신하고 처리하도록 설계된 Android 구성 요소입니다. Activity 및 Service와 달리 Broadcast Receiver에는 사용자 인터페이스가 없습니다 — 이벤트 발생 시 짧은 작업을 실행하는 것이 역할입니다.
Broadcast Receiver는 Intent 메커니즘을 통해 작동합니다. 시스템 또는 애플리케이션이 sendBroadcast 또는 sendOrderedBroadcast를 통해 Intent를 보내면 운영 체제가 등록된 리시버에 전달합니다. 각 리시버는 메인 스레드에서 실행되는 onReceive 메서드에서 Intent를 수신합니다.
Android Compatibility Definition Document에 따르면 Broadcast Receiver는 10초 이내에 onReceive를 완료해야 합니다 — 그렇지 않으면 시스템이 중단된 것으로 간주하고 프로세스를 종료합니다. 장기 실행 백그라운드 작업의 경우 리시버에서 JobScheduler 또는 WorkManager를 시작하세요.
Android는 두 가지 주요 Broadcast 유형을 지원합니다: Normal Broadcast와 Ordered Broadcast입니다. 차이점은 전달 순서와 처리 체인을 중단하는 기능에 있습니다. 또한 Broadcast는 시스템(OS에 의해 생성됨)과 사용자 정의(애플리케이션에 의해 생성됨)로 나뉩니다.
Normal Broadcast는 순서 보장 없이 모든 등록된 리시버에 비동기적으로 전달됩니다. 시스템은 이러한 Broadcast를 병렬로 처리할 수 있습니다 — 각 리시버는 자체 스레드에서 Intent를 받습니다. Normal Broadcast에서 abortBroadcast를 호출해도 효과가 없습니다: 다른 리시버로의 전달을 취소할 수 없습니다.
Ordered Broadcast는 순차적으로 전달됩니다 — android:priority 속성의 내림차순(0~999)으로 각 리시버에 전달됩니다. 처리 후 리시버는 setResultExtras를 통해 다음 리시버에 결과를 전달하거나 abortBroadcast를 호출하여 체인을 중단할 수 있습니다. 이는 SMS 리시버와 같이 처리 순서가 중요한 시나리오에서 사용됩니다.
Android는 많은 시스템 Broadcast를 생성합니다: ACTION_BOOT_COMPLETED(장치 부팅), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED 등. 각 Intent에는 Extras에 추가 데이터(배터리 잔량, 연결 유형, 패키지 이름)가 포함됩니다.
| Broadcast 유형 | 순서 | abortBroadcast | 성능 |
|---|---|---|---|
| Normal | 보장되지 않음 | 작동 안 함 | 높음(병렬) |
| Ordered | 우선순위별 | 작동함 | 중간(순차) |
| Sticky | 단일 값 | 해당 없음 | 낮음(API 21부터 지원 중단) |
Sticky Broadcast는 마지막으로 전송된 값을 유지하는 지원 중단된 유형입니다. 대신 LiveData, StateFlow 또는 공유 SharedPreferences를 사용하여 최신 상태를 저장하세요.
Broadcast Receiver는 두 가지 방법으로 등록할 수 있습니다: 정적으로 AndroidManifest.xml을 통해 또는 동적으로 코드에서 registerReceiver를 통해. 선택은 시나리오에 따라 다릅니다: 정적 등록은 애플리케이션이 실행되지 않는 경우에도 작동하고, 동적 등록은 등록 구성 요소가 활성화된 동안에만 작동합니다.
정적 등록은 매니페스트에서 <receiver> 태그로 <application> 내에 선언됩니다. 각 리시버에 대해 핸들러 클래스와 가로챌 작업이 포함된 Intent 필터가 지정됩니다. 시스템은 애플리케이션이 실행되지 않는 경우에도 Broadcast 발생 시 이러한 리시버를 로드합니다.
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
동적 등록은 Activity, Service 또는 Fragment 코드에서 registerReceiver 메서드를 사용하여 수행됩니다. 리시버는 등록한 구성 요소가 활성화된 동안에만 유지됩니다. onPause 또는 onDestroy에서 항상 unregisterReceiver를 호출하세요 — 그렇지 않으면 메모리 누수가 발생하고 시스템이 프로세스를 종료할 수 있습니다.
Ordered Broadcast의 경우 전달 순서는 android:priority 속성에 의해 결정됩니다. 우선순위가 높은 리시버가 먼저 Intent를 받습니다. 처리 후 abortBroadcast를 호출하면 낮은 우선순위의 리시버는 Intent를 받지 못합니다. 정적 리시버의 경우 매니페스트의 Intent 필터에서 우선순위가 설정됩니다.
Ordered Broadcast의 리시버는 setResultExtras 또는 setResultData를 통해 체인의 다음 리시버에 데이터를 전달할 수 있습니다. 이를 통해 파이프라인 처리가 가능합니다: 첫 번째 리시버가 Intent에 추가 데이터를 추가하고, 두 번째가 사용하고, 세 번째가 체인을 완료합니다. getResultExtras 메서드는 이전 리시버가 전달한 데이터를 읽습니다.
Normal Broadcast의 경우 순서가 보장되지 않으므로 모든 리시버는 변경되지 않은 원본 Intent를 받습니다. 리시버가 서로 영향을 미쳐야 하는 경우 sendBroadcast 대신 sendOrderedBroadcast를 사용하세요.
Android 8(API 26, Oreo)은 백그라운드 Broadcast에 중요한 제한 사항을 도입했습니다. 대부분의 암시적 Broadcast — 특정 애플리케이션을 대상으로 하지 않는 것 — 는 정적 등록으로 더 이상 작동하지 않습니다. 시스템은 CONNECTIVITY_ACTION 또는 ACTION_BATTERY_LOW와 같은 작업에 대해 매니페스트에 등록된 리시버를 차단합니다.
Google은 정적 등록에서 계속 작동하는 Broadcast 목록을 확정했습니다: BOOT_COMPLETED, TIME_TICK, Alarm 및 패키지 변경 — 총 약 12개의 예외입니다. 다른 모든 암시적 Broadcast는 이제 앱이 포그라운드에 있을 때만 작동하는 Context.registerReceiver를 통한 동적 등록이 필요합니다.
이전에 Broadcast Receiver를 통해 처리되던 백그라운드 작업의 경우 Android는 WorkManager(실행 보장이 있는 지연 작업), JobScheduler(장치 상태를 고려한 정기 작업) 및 NotificationListenerService(알림 모니터링)를 권장합니다. 이러한 구성 요소는 Android 8 제한 없이 작동하며 전력 소비에 최적화되어 있습니다.
네트워크 연결을 추적하기 위한 Broadcast Receiver를 만들어 보겠습니다. 리시버는 CONNECTIVITY_ACTION Broadcast를 캡처하고 연결 유형을 로그합니다. Android 8+의 경우 정적 등록에서 제외된 암시적 Broadcast이므로 동적으로 등록하겠습니다.
// 네트워크 상태 추적을 위한 Broadcast Receiver
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "연결 유형: $connectionType")
}
}
// Activity에서의 동적 등록
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
onStop에서 항상 리시버 등록을 취소하세요 — Activity가 백그라운드로 전환되지만 리시버가 등록된 상태로 남아 있으면 시스템이 리소스를 해제할 수 없습니다. Service의 경우 onDestroy를 사용하세요. 프래그먼트에서는 프래그먼트 수명 주기에 따라 onStart에서 리시버를 등록하고 onStop에서 등록을 취소하세요.
자주 묻는 질문
Broadcast Receiver는 시스템 및 사용자 정의 Broadcast 메시지를 처리하기 위한 Android 구성 요소입니다. onReceive 메서드에서 Intent를 수신하며, 메인 스레드에서 실행되고 10초 이내에 완료되어야 합니다. 장기 실행 작업의 경우 WorkManager 또는 JobScheduler를 사용하세요.
Normal Broadcast는 모든 리시버에 비동기 및 병렬로 전달됩니다 — 순서가 보장되지 않고 abortBroadcast가 작동하지 않습니다. Ordered Broadcast는 우선순위에 따라 순차적으로 전달되며, 각 리시버가 체인을 중단하거나 setResultExtras를 통해 다음 리시버에 데이터를 전달할 수 있습니다.
정적 등록(매니페스트에서)은 애플리케이션이 실행되지 않는 경우에도 리시버가 작동할 수 있게 합니다. 동적 등록(registerReceiver를 통해)은 등록 구성 요소가 활성화된 동안에만 작동합니다. Android 8부터 많은 암시적 Broadcast에 동적 등록이 필요합니다.
Android 8(API 26)은 CONNECTIVITY_ACTION 또는 ACTION_BATTERY_LOW와 같은 대부분의 암시적 Broadcast에 대한 정적 등록을 금지했습니다. 예외에는 BOOT_COMPLETED, Alarm, 시간 및 기타 일부가 포함됩니다. 백그라운드 작업의 경우 Broadcast 대신 WorkManager를 사용하세요.
LiveData, StateFlow, EventBus 또는 LocalBroadcastManager를 사용하여 onReceive에서 UI로 데이터를 전달하세요. onReceive에서 직접 UI를 업데이트하려고 하지 마세요 — 메인 스레드에서 실행되지만 리시버가 Activity의 가시성을 보장하지 않습니다. LocalBroadcastManager는 내부 통신을 위한 지원 중단된 옵션입니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.