정적 등록 방식을 이용한 부팅 알림 구현

이전 섹션의 동적 등록과 대조하여, 정적 등록 브로드캐스트 리시버를 설명합니다. 이를 통해 기기 부팅이 완료되면 시스템 브로드캐스트를 수신하고 토스트 메시지를 표시하도록 구현합니다.

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(응답 없음)로 간주하여 앱이 크래시됩니다.

권장 사항: 리시버는 가벼운 트리거 작업만 수행하도록 하세요. 예를 들어:

  1. 알림 표시
  2. 백그라운드 서비스 시작
  3. Activity 시작 및 복잡한 비즈니스 로직은 Service에 위임. onReceive에 직접 작성하지 마세요.

정적 등록 방식을 이용한 부팅 알림 구현

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다