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 에서 해제해야 합니다.
아래는 안드로이드 디벨로퍼스의 문서를 번역한 부분입니다.
방송수신자는 안드로이드 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대 컴포넌트를 공부할 때 방송수신자는 앱들간에 소통을 위해 필요한 것이라고 생각했는데, 위의 공식문서에서 처럼 액티비티 컴포넌트들 사이에서도 사용할 수 있는 것을 처음으로 알게되었고, 앞으로도 유용하게 사용할 것 같습니다!