이벤트 모델로 실행되는 컴포넌트라고 정의한다.
여기서 이벤트는 부팅이 완료되는 것과 같은 시스템의 특정한 상황을 의미한다.
액티비티처럼 인텐트를 시스템에 전달함으로써 실행한다.
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
}
}
BroadcastReceiver를 상속받는 클래스를 선언해야 한다.
리시버의 생명주기 함수는 onReceive() 하나뿐이며, 리시버를 실행하려고 인텐트를 시작하면 해당 함수가 자동으로 호출된다.
컴포넌트이므로 매니페스트 파일에 등록한다.
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
}
}
리시버 객체는 액티비티나 서비스에서 생성 가능하다.
그리고 필요한 순간에 registerReceiver() 함수를 이용해 시스템에 등록하고, 해지한다.
val filter = IntentFiter("ACTION_RECEIVER")
registerReceiver(receiver, filter)
...
unregisterReceiver(receiver)
val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
리시버는 액티비티와는 달리 없는 리시버를 실행해도 오류가 뜨지 않으며, 여러개 실행이 가능하다.
부팅이 완료되면 시스템에서 android.intent.action.BOOT_COMPLETED라는 액션 문자열을 포함하는 인텐트가 발생한다.
이때 실행할 리시버에는 의 name 속성에 같은 액션 문자열을 등록한다.
<receiver
...>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
리시버를 실행하려면 권한이 필요하므로 매니페스트에 퍼미션을 추가해야 한다.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
화면을 켜고 끄는 리시버는 매니페스트에 등록하면 실행되지 않는다.
따라서 registerReciver() 함수를 이용해 동적으로 등록해야 한다.
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
Intent.ACTION_SCREEN_ON -> Log.d("kkang", "screen on")
Intent.ACTION_SCREEN_OFF -> Log.d("kkang", "screen off")
}
}
}
배터리와 관련된 정보나 상태 변화를 앱에서 감지할 수 있다.
배터리 상태가 변경되면 다음 액션 문자열로 인텐트가 발생한다.