이전 섹션의 동적 등록과 대조하여, 정적 등록 브로드캐스트 리시버를 설명합니다. 이를 통해 기기 부팅이 완료되면 시스템 브로드캐스트를 수신하고 토스트 메시지를 표시하도록 구현합니다.
1. 동적 등록 vs 정적 등록 핵심 차이점
- 동적 등록: 코드에서
registerReceiver를 호출하여 등록하며, 일반적으로 Activity의onCreate안에 작성합니다. 앱을 한 번 이상 실행해야 브로드캐스트를 받을 수 있으며, 앱이 종료되면 더 이상 수신할 수 없습니다. 등록과 해제를 수동으로 제어할 수 있어 유연합니다. - 정적 등록:
AndroidManifest.xml파일에<receiver>태그를 작성하여 등록합니다. 앱을 미리 실행할 필요 없이, 시스템 부팅이 완료되면 자동으로 리시버가 깨어나 시스템 브로드캐스트를 수신합니다.
2. 전체 단계
① 브로드캐스트 리시버 클래스 BootCompleteReceiver 생성
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "시스템 부팅이 완료되었습니다", Toast.LENGTH_LONG).show();
}
}
Code language: PHP (php)
- 생성 방법: Android Studio에서 패키지 우클릭 → New → Other → Broadcast Receiver 선택.
- 파라미터 설명:
Enabled: 이 리시버를 활성화할지 여부 (체크).Exported: 앱 외부에서 오는 시스템 브로드캐스트를 수신할지 여부 (체크. 시스템 부팅 브로드캐스트를 받아야 하므로 외부 브로드캐스트 허용 필요).
일부 강의 자료에서 manifest에
exported="false"로 작성한 것은 잘못된 것입니다. 시스템 브로드캐스트를 수신하려면exported="true"로 설정해야 합니다.
② AndroidManifest.xml에 권한 추가
<!-- 부팅 완료 브로드캐스트 수신 권한 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Code language: HTML, XML (xml)
③ <application> 내부에 리시버 및 intent-filter 정적 등록
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- 부팅 완료 액션 -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
intent-filter: 이 리시버가 어떤 유형의 브로드캐스트를 수신할지 선언하는 필터입니다. 여기서는BOOT_COMPLETED시스템 부팅 브로드캐스트를 감지합니다.
3. 주의사항
onReceive() 안에는 시간이 오래 걸리는 로직을 작성하면 안 됩니다! 브로드캐스트 리시버의
onReceive는 메인 스레드에서 실행되며, 실행 시간 제한이 매우 짧습니다(약 10초). 무거운 작업을 수행하면 시스템이 ANR(응답 없음)로 간주하여 앱이 크래시됩니다.
권장 사항: 리시버는 가벼운 트리거 작업만 수행하도록 하세요. 예를 들어:
- 알림 표시
- 백그라운드 서비스 시작
- Activity 시작 및 복잡한 비즈니스 로직은 Service에 위임.
onReceive에 직접 작성하지 마세요.
정적 등록 방식을 이용한 부팅 알림 구현
Previous: Android 네트워크 연결/끊김 브로드캐스트 감시
Next: 사용자 정의 브로드캐스트 전송