안드로이드 시스템에서는 시스템에서 일어나는 이벤트를 마치 방송국처럼 방송한다. 그 중에 원하는 시스템 이벤트를 받아서 처리하고 싶을 때 사용하는 컴포넌트이다.
시스템 이벤트라 함은 다음과 같은 것들이 있다.
- 부팅 완료(BOOT_COMPLETED): 장치가 부팅되고 시스템이 완전히 시작된 후에 발생하는 이벤트. 이 이벤트를 처리하여 앱이 부팅 후에 자동으로 시작되도록 할 수 있다.
- 네트워크 상태 변경(CONNECTIVITY_CHANGE): 장치의 네트워크 연결 상태가 변경될 때 발생하는 이벤트. 이벤트를 수신하여 네트워크 연결 상태에 대한 작업을 수행할 수 있다.
- 애플리케이션 설치(PACKAGE_ADDED, PACKAGE_REMOVED): 새로운 앱이 설치되거나 기존 앱이 제거될 때 발생하는 이벤트. 이를 통해 앱이 설치 또는 제거될 때 추가적인 작업을 수행할 수 있다.
- 충전 상태 변경(ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED): 충전기가 연결되거나 연결이 해제될 때 발생하는 이벤트. 충전 상태에 따라 알림을 받고 해당 이벤트를 처리할 수 있다.
- 화면 켜기(ACTION_SCREEN_ON, ACTION_SCREEN_OFF): 디바이스의 화면이 켜지거나 꺼질 때 발생하는 이벤트. 화면 상태에 따라 특정 작업을 수행할 수 있다.
- 위치 변경(ACTION_LOCATION_CHANGED): 장치의 위치가 변경될 때 발생하는 이벤트. 위치 변경 이벤트를 수신하여 위치 기반 서비스를 활성화하거나 관련 작업을 수행할 수 있다
브로드캐스트 리시버도 컴포넌트이므로 매니패스트 파일에서 관리되고, 인텐트로 정보를 전달하여 사용한다. 다만 매니패스트에 등록하는 것은 이 브로드캐스트 리시버의 경우에만! 지양
그리고 브로드캐스트 리시버는 시스템 이벤트 뿐만 아니라 사용자 정의 이벤트, 앱 내 이벤트 등도 처리할 수 있다. 발생하는 이벤트들을 안테나로 낚아채서 원하는 행동을 하도록 해주는거라고 보면 될 것 같다.
(요부분을 예제로 알아보겠다)
onReceive() 하나이다. OnReceive()에서 어떤 행동을 발생시킬지 정하는 것1) 리시버 동적 생성 (액티미티나 서비스 컴포넌트에서)
BroadcastReceiver 상속받은 객체 생성val receiver = object: BroadCastReceiver(){
override fun onReceive(context: Context?, intent:Intent?){
}
}
2) 동적 등록
registerReceiver 함수로 시스템에 리시버 등록. 사용할 필요 없으면 해제해줘야 함!val iflter = IntentFilter("ACTION_RECIVER")
registerReceiver(receiver, filter)
3) 해제
unregisterReceiver(receiver)
sendBroadcast() 함수로 시스템에 전달해줌val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
MyReceiver.ktclass MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val custom = intent?.action.toString()
if (intent.action.equals(Intent.ACTION_POWER_CONNECTED)) {
Toast.makeText(context, "전원 연결 상태",LENGTH_SHORT ).show()
}
else if (intent.action.equals(Intent.ACTION_POWER_DISCONNECTED )) {
Toast.makeText(context, "전원 해제 상태", LENGTH_SHORT).show()
}
else if (custom.equals("CUSTOM_CLICK")){
Toast.makeText(context, "클릭", LENGTH_SHORT).show()
}
}
}
// 인텐트 필터 설정 (내가 수신할 이벤트들 설정)
val filter = IntentFilter(Intent.ACTION_POWER_CONNECTED).apply {
addAction(Intent.ACTION_POWER_DISCONNECTED)
addAction("CUSTOM_CLICK")
}
registerReceiver에 위에 정의해둔 인텐트 필터를 넣어준다.sendBroadcast(intent)를 통해 방송된다.// 리시버 등록
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(receiver, filter, RECEIVER_EXPORTED)
}else {
registerReceiver(receiver, filter)
}
binding.button.setOnClickListener {
val intent = Intent("CUSTOM_CLICK")
sendBroadcast(intent)
}
맥북 사양으로 인해... 매우 느리게 클릭 토스트메세지가 뜨는 19초짜리 gif이다.

매니페스트 파일에 인텐트 필터를 등록하고 사용하는 법도 있는데 지양되는 방법이라하여 실습은 진행하지 않았다..하지만 알 필요가 있을 듯 하다;;
일단 내가 이해한 바로는 ... 리시버에서 수신할 주파수를 정해두고 그거에 대한 액션 설정 / 메인에서는 인텐트 필터를 통해 수신할 인텐트들을 정해서 registerReceiver에 등록한다. 이 때 사용자 정의 이벤트가 있다면 따로 인텐트를 생성해야하고 sendBroadcast로 보내주어야 한다는 것이다.
그럼 20000...
더 공부할 것들