-
브로드캐스트 리시버(Broadcast Receiver)Android 2024. 8. 28. 13:06
정의
- 시스템에 부팅 완료와 같은 특정 상황이 발생할 때 (= 이벤트가 발생하면) 실행되는 컴포넌트
- 줄여서 리시버라고 함.
- 해석하면 '방송 수신기' → 시스템에서 특정 상황이 발생했을 때 이를 받아서 처리하는 수신기인 브로드캐스트 리시버를 앱에 장착한다.
실행 방법
안드로이드 4대 컴포넌트 중 하나이므로, 시스템에 인텐트를 전달하여 실행한다.
브로드캐스트 리시버 생성/등록
class MyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { // 다른 컴포넌트에서 해당 리시버를 실행하려고 인텐트를 시스템에 전달하면, 리시버의 onReceive() 함수가 자동 호출된다. // intent -> 자신을 호출한 인텐트 객체를 매개변수로 전달받음 // 해당 함수는 실행한 후 10초 이내에 완료할 것을 권장함 -> 오래 걸리는 작업을 담기에는 부적절함 // 해당 함수가 실행을 마치면 리시버 객체는 소멸됨 } }
브로드캐스트 리시버의 생명주기 함수는 onReceive() 하나 뿐이다.
이 또한 안드로이드 4대 컴포넌트 중 하나이므로 매니페스트 파일에 등록한다.
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"/>
name 속성을 필수이고, 리시버를 명시적 인텐트로 실행하는 경우 클래스명(android:name)만 등록하고, 암시적 인텐트로 실행하는 경우는 <intent-filter> 태그를 선언해야 한다.
브로드캐스트 리시버 동작 원리 브로드캐스트 리시버 동적 등록/해제
메니페스트에 등록하지 않으면 코드에서 동적으로 등록하는 방법이 있다.
1. 객체 생성
// 다른 컴포넌트(액티비티, 서비스)에서 작성한 코드 // 리시버 객체 생성 val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent) { ... } }
2. 시스템에 등록
val filter = IntentFilter("ACION_RECEIVER") registerReceiver(receiver, filter)
해당 코드를 통해 리시버를 시스템에 등록할 수 있다. (객체만 만들었을땐 시스템에 등록되지 않는다.)
이렇게 하면 매니페스트에 등록하지 않아도 시스템에서 리시버의 존재를 인지한다.
registerReceiver 로 등록한 리시버는 사용 후 필요 없으면 해제해야 한다.
3. 리시버 해제
unregisterReceiver(receiver)
브로드캐스트 리시버 실행
메니페스트 파일에 등록 O
(intent-filter 사용)암시적 인텐트 실행불가
(원인: 백그라운드 제약)메니페스트 파일에 등록 X
(코드에서 동적 등록)암시적 인텐트 실행가능 val intent = Intent(this, MyReceiver::class.java) sendBroadcast(intent)
해당 코드로 리시버 정보를 담은 인텐트를 시스템에 전달한다.
전달한 후 시스템은 리시버 객체를 생성하여 실행한다.
실행 대상 브로드캐스트 리시버 수 동작 없음 실행한 곳에서 오류 발생X 1개 정상 실행 여러개 모두 실행 'Android' 카테고리의 다른 글
서비스 생명주기 - startService/bindService (0) 2024.09.12 안드로이드 기본 앱과 연동하기 - 갤러리 앱 (3) 2024.09.05 Activity Component (0) 2024.08.13 Material Library (0) 2024.07.31 ReadMe 작성 추천 링크 (0) 2024.07.02