[안드로이드] 다른 Activity 에서 Activity 죽이기/ Broadcast 로 Activity 죽이기

에짱·2021년 9월 6일
0
post-custom-banner

Activity B -> A 로 넘어갈 때는 B 를 살려서 백버튼을 눌렀을 때, 뒤로 돌아갈 수 있게 하지만,
A가 죽을 때 B도 죽이고 싶은 경우가 있습니다.

구글링 결과 flag 를 사용하는 방법도 있었지만,
저의 경우 작동되지 않아서
broadcast receiver를 사용해서 문제를 해결했습니다.

//Activity A
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent("finish_B"))
finish()
//Activity B
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        registerBr()
    }

private val reviewBr = object : BroadcastReceiver() {
    override fun onReceive(p0: Context?, p1: Intent?) {
            if(p1?.action.equals("finish_B")) {
                this@ActivityB.finish()
            }
        }

    }

private fun registerBr() {
        val filter = IntentFilter("finish_explanation")
        LocalBroadcastManager.getInstance(this).registerReceiver(reviewBr, filter)
        //시스템 혹은 다른 앱이 아니라, 하나의 앱 내에서 발생한 Broadcast를 수신하는 경우 
        //LocalBroadcastManager를 사용해야 한다. (ex.액티비티 간에 방송 송수신하는 경우)
    }

private fun unregisterBr() {
        LocalBroadcastManager.getInstance(this).unregisterReceiver(reviewBr)
    }

override fun onDestroy() {
        unregisterBr()
        super.onDestroy()
    }

Activity 에서 등록한 broadcast receiver 는 등록을 해제해주어야 불필요한 메모리 사용을 막을 수 있습니다. 해제는 lifecycle에 일관성있게 하면 됩니다. onCreate 에서 등록한 경우에는 onDestroy 에서 해제하고 onResume 에서 등록한 경우에는 onPause 에서 해제해야 합니다.

BroadCast Receiver 방송수신자

아래는 안드로이드 디벨로퍼스의 문서를 번역한 부분입니다.

방송수신자는 안드로이드 4대 컴포넌트 중 하나로, 시스템이 각종 이벤트를 앱으로 전달(방송)할 수 있게 하고, 앱이 시스템의 방송에 응답할 수 있게 합니다.
방송수신자는 앱으로의 엔트리(entry) 중 하나이므로, 현재 작동중이지 않은 앱에도 시스템이 방송할 수 있도록 합니다.

많은 방송들은 시스템에서 시작되는데 예를 들면, 스크린이 꺼지거나, 배터리 상태가 낮은 경우, 스크린이 캡쳐된 경우 등 방송을 할 수 있습니다.

앱이 스스로 방송을 할 수도 있습니다. 예를 들어 어떤 데이터가 다운로드 되었을 때, 다른 앱들도 사용할 수 있도록 알릴 수 있습니다.

방송 수신자는 유저와 상호작용하는 UI 는 없지만, 방송 이벤트가 발생했을 때 상태바에 알림을 줄 수 있습니다. 하지만 방송 수신자는 단지 다른 컴포넌트로의 입구/통로(gateway) 이므로 매우 작은 일을 하게끔 되어 있습니다. (굳이 알림을 주지 않아도 된다는 뜻인듯 합니다.)

방송 수신자는 BroadcastReceiver 클래스의 subclass 로 구현되어 있고, 각 방송들은 Intent 객체로 전달됩니다.

정리

A broadcast receiver is just a gateway to other components and is intended to do a very minimal amount of work.

4대 컴포넌트를 공부할 때 방송수신자는 앱들간에 소통을 위해 필요한 것이라고 생각했는데, 위의 공식문서에서 처럼 액티비티 컴포넌트들 사이에서도 사용할 수 있는 것을 처음으로 알게되었고, 앞으로도 유용하게 사용할 것 같습니다!

profile
지금 여기. Here and Now
post-custom-banner

0개의 댓글