BroadcastReceiver 컴포넌트를 알아보자

두리두두·2024년 5월 18일

Android

목록 보기
17/25
post-thumbnail
  • 안드로이드 4대 컴포넌트 중 하나인 브로드캐스트 리시버에 대해 알아보자

🕯 Broadcast Receiver란?

  • 안드로이드 시스템에서는 시스템에서 일어나는 이벤트를 마치 방송국처럼 방송한다. 그 중에 원하는 시스템 이벤트를 받아서 처리하고 싶을 때 사용하는 컴포넌트이다.

  • 시스템 이벤트라 함은 다음과 같은 것들이 있다.

    • 부팅 완료(BOOT_COMPLETED): 장치가 부팅되고 시스템이 완전히 시작된 후에 발생하는 이벤트. 이 이벤트를 처리하여 앱이 부팅 후에 자동으로 시작되도록 할 수 있다.
    • 네트워크 상태 변경(CONNECTIVITY_CHANGE): 장치의 네트워크 연결 상태가 변경될 때 발생하는 이벤트. 이벤트를 수신하여 네트워크 연결 상태에 대한 작업을 수행할 수 있다.
    • 애플리케이션 설치(PACKAGE_ADDED, PACKAGE_REMOVED): 새로운 앱이 설치되거나 기존 앱이 제거될 때 발생하는 이벤트. 이를 통해 앱이 설치 또는 제거될 때 추가적인 작업을 수행할 수 있다.
    • 충전 상태 변경(ACTION_POWER_CONNECTED, ACTION_POWER_DISCONNECTED): 충전기가 연결되거나 연결이 해제될 때 발생하는 이벤트. 충전 상태에 따라 알림을 받고 해당 이벤트를 처리할 수 있다.
    • 화면 켜기(ACTION_SCREEN_ON, ACTION_SCREEN_OFF): 디바이스의 화면이 켜지거나 꺼질 때 발생하는 이벤트. 화면 상태에 따라 특정 작업을 수행할 수 있다.
    • 위치 변경(ACTION_LOCATION_CHANGED): 장치의 위치가 변경될 때 발생하는 이벤트. 위치 변경 이벤트를 수신하여 위치 기반 서비스를 활성화하거나 관련 작업을 수행할 수 있다
  • 브로드캐스트 리시버도 컴포넌트이므로 매니패스트 파일에서 관리되고, 인텐트로 정보를 전달하여 사용한다. 다만 매니패스트에 등록하는 것은 이 브로드캐스트 리시버의 경우에만! 지양

  • 그리고 브로드캐스트 리시버는 시스템 이벤트 뿐만 아니라 사용자 정의 이벤트, 앱 내 이벤트 등도 처리할 수 있다. 발생하는 이벤트들을 안테나로 낚아채서 원하는 행동을 하도록 해주는거라고 보면 될 것 같다.
    (요부분을 예제로 알아보겠다)

🕯 종류

암시적 브로드캐스트

  • AndroidManifast 파일에 브로드캐스트 리시버와 인텐트를 등록하여 사용
  • 액티비티의 라이프사이클과 무관하게 작동, 앱이 설치되면 즉시 사용가능하며, 등록과 해지가 자유롭지 못하다.
  • 그러나 안드로이드버전 오레오 이후에는 사용이 지양되었다.

명시적 브로드캐스트

  • 동적으로 브로드캐스트 리시버를 생성, 호출, 종료하는 방법이다.
  • 생명주기가 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.kt
  • 두 개의 시스템 이벤트와 한 개의 사용자 정의 이벤트에 대한 행동을 설정한다.
class 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에 위에 정의해둔 인텐트 필터를 넣어준다.
  • 시스템 이벤트는 자동으로 캐치되고, 사용자 정의 이벤트는 onClickListenr에서 "CUSTUM_CLICK"이라는 인텐트를 만든 후,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...


더 공부할 것들

  • 인텐트와 인텐트필터에 대한 이해가 부족해서 이해하는데 오래 걸렸던 듯 하다
profile
야금야금 앱 개발자

0개의 댓글