BroadCastManager로 이벤트 수신하기

2022. 3. 25. 14:13개발/Android

 

 

 

또 까먹을까봐 우당탕탕 쓰러왔다.

여담이지만 최초 기획자도 내가 아니고, 설계자도 아니고, 최초로 구현한 사람도 내가 아닌

어플의 이슈를 대응하다보면...

한번에 클린코드가 나오기 어려운것 같다.

그래서 개판으로 짜고있음 ㅇㅅaㅇ근데 우짜겠노 급한데

나중에 리팩토링 하거나 해야지 뭐...

 

어쨌든 오늘은 특정 이벤트 발생 즉시 다른 액티비티에서 이를 감지하고

뷰를 전체적으로 갱신하는 로직이 필요했다.

 

안드로이드 개발자라면 다 아는 4대 컴포넌트...중 하나인 BroadcastReceiver를 이용해 구현하기로 한다.

 

 

 

 

1.  이벤트 보내는 함수 등록

 private fun sendIntent(){
        val intent = Intent(EVENT_NAME)
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
   }

보내는쪽에서 이걸 등록해준다. 이벤트네임은 알아서 잘 짓기.

보내는쪽에선 이것만 등록하면 된다. 다음부턴 받는쪽의 코드다.

 

 

 

 

2.  Receiver등록함수 작성

    private fun registerReceiver() {
        val intentFilter = IntentFilter()
        intentFilter.addAction(EVENT_NAME)
        LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, intentFilter)
    }

우선 리시버를 등록해주는 함수를 작성한다.

이 함수는 onCreate() 등의 컴포넌트 시작 부분에서 호출해주면 된다.

 

 

 

 

3.  Receiver해제함수 작성

  private fun unregisterReceiver() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
    }

당연히!!!!!!등록을 해줬으면 알아서 해제도 해줘야한다. 메모리 누수 방지를 위해서.

해제함수는 onDestroy()등의 종료함수 안에서 호출해주면 된다.

 

 

 

 

4.  Receiver 생성

    private val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            when (intent.action) {
                INTENT_NAME -> {
                    //action
                }
                INTENT_NAME2 -> {
                   //action
                }
            }
        }
    }

마지막이다. 받는쪽에서 리시버를 생성해두면, 이벤트가 감지되었을때 여기로 넘어온다.

나는 intent는 여러개이고, 하나의 액티비티에서 이를 수신해서 각각 다른 액션을 만들어줘야했으므로 분기를 뒀다.

 

 

 

 

 

 

 

 

 

 

즉, 받는쪽에서

onCreate시 receiver등록 -> 보내는쪽에서 send -> 리시버가 인텐트 수신 -> 받는쪽 컴포넌트 종료시 리시버 해제

순이 되겠다.

 

끝.