Concepts of BroadcastReceiver
1. BroadcastReceiver
- 이벤트(유저 이벤트가 아닌 시스템의 특정 상황) 모델로 실행되는 컴포넌트
- BroadcastReceiver를 만들고 안드로이드 시스템이 특정 상황이 됐을 때 시스템에 의해 BroadcastReceiver가 실행
- 코드에서 어떤 특정 상황이 됐을 때(유저 이벤트X) 시스템에 알려줘서 시스템에 의해 실행
2. BroadcastReceiver 사용 방법
1) BroadcastReceiver를 상속받은 클래스 작성
class MyReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
}
}
2-1) AndroidManifest.xml 파일에 등록
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true"></receiver>
- name 속성은 생략 불가, 클래스명 정보를 주는 것
2-2) AndroidManifest.xml에 등록시키지 않고 코드에서 필요한 순간 동적 등록이 가능
val receiver = object: BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
}
}
val filter = IntentFilter("ACTION_RECEIVER")
registerReceiver(receiver, filter)
- Manifest에 등록되면 항상 실행되고 보통 특정 상황에서만 실행하기를 원하기 때문에 이 방법을 더 많이 사용
- IntentFilter에 Receiver가 언제 실행이 되어야 하는지에 대한 정보를 담아줌
- 필요한 순간 registerReceiver() 함수를 통해 등록하면 시스템에 등록 됨
- 2-1)에서 receiver 태그 안에 intent-filter 태그와 action 태그를 담아주는 것과 동일
unregisterReceiver(receiver)
- 필요한 순간 사용하고 다 사용을 했을 때는 unregisterReceiver() 함수로 해제
3) BroadcastReceiver 실행
val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
- BroadcastReceiver가 component이기 때문에 intent 필요, intent filter가 존재하면 암시적 인텐트 존재하지 않으면 명시적 인텐트 준비
- sendBroadcast() 함수로 리시버 실행
3. Intent 동작 원리
1) Activity Intent 동작 원리
- Activity Intent가 발생했을 때
- intent filter에 의해 조건에 맞는 것이 없다면 intent를 발생시킨쪽 코드에서 에러
- 조건에 맞는 것이 1개면 실행
- 조건에 맞는 것이 여러 개면 유저 선택성으로 하나만 실행(앱에서 인터넷 실행할 때 삼성 인터넷, chrome 등 선택하는 것)
2) BroadcastReceiver Intent 동작 원리
- BroadcastReceiver Intent가 발생했을 때
- intent filter에 의해 조건에 맞는 것이 없어도 에러 발생하지 않음
- 조건에 맞는 것이 1개면 실행
- 조건에 맞는 것이 여러 개면 모두 실행
시스템 이벤트 활용
- BroadcastReceiver가 시스템의 특정 상황에서 실행되는 경우
1. 부팅 완료
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
- 부팅 완료 시점에 특정 업무를 진행
- BroadcastReceiver를 만들고 AndroidManifest.xml 파일에서 시스템에 띄우는 인텐트 정보로 intent-filter를 구성해 등록
2. 스크린 온/오프
val filter = IntentFilter(Intent.ACTION_SCREEN_ON).apply{
addAction(Intent.ACTION_SCREEN_OFF)
}
registerReceiver(receiver, filter)
- 스크린이 on/off 되는 순간 BroadcastReceiver를 실행
- 코드에서 registerReceiver() 함수를 이용해 동적 등록해야만 실행, Manifest로 등록하는 정적 등록으로는 receiver가 실행이 되지 않음
3. 배터리 상태
- 배터리와 관련된 액션 문자열, 배터리가 특정 상태가 되었을 때 시스템에서 인텐트 발생
- android.intent.acion.BATTERY_LOW : 배터리가 낮은 상태로 변경되는 순간
- android.intent.acion.BATTERY_OKAY : 배터리가 정상 상태로 변경되는 순간
- android.intent.acion.BATTERY_CHANGED : 충전 상태가 변경되는 순간
- android.intent.acion.ACTION_POWER_CONNECTED : 전원이 공급되기 시작한 순간
- android.intent.acion.ACTION_POWER_DISCONNECTED : 전원 공급을 끊은 순간