이 글은 안드로이드에서 Activity 전환 시 이전 Activity가 완전히 종료되지 않고 스택에 남아있는 이유와, LocalBroadcastManager를 사용하여 Activity 간 통신을 처리하는 방법에 대해 설명합니다.
1. Activity 스택 동작 방식
안드로이드에서는 Activity 전환 시 이전 Activity가 바로 종료되지 않고 백그라운드 스택에 남아있습니다. 이전 Activity가 완전히 종료되는 경우는 다음과 같습니다:
- finish()가 명시적으로 호출되는 경우
- 시스템 메모리가 부족한 경우
- manifest에서 configChange 설정에 의해 종료되는 경우
- Activity의 launchMode 설정에 따라
예시: Activity 전환 시 스택 상태
예를 들어, Activity A에서 Activity B로 전환한다고 가정할 때 코드와 스택 상태는 아래와 같습니다:
// Activity A에서 B로 이동
startActivity(Intent(this, ActivityB::class.java))
// 스택 상태:
// [Activity B] (foreground)
// [Activity A] (stopped)
위 코드에서 Activity A는 onPause() -> onStop()으로 상태가 전환되고, Activity B는 onCreate() -> onStart() -> onResume() 순서로 실행됩니다. 이렇게 이전 Activity가 바로 종료되지 않고 백그라운드에 남아있는 것이 안드로이드의 스택 관리 방식입니다.
2. startActivityForResult() 사용 예시
startActivityForResult()를 사용하면 호출한 Activity가 결과를 받을 수 있도록 보장되므로, 이전 Activity가 살아있어야 합니다.
// ActivityA.kt
startActivityForResult(intent, REQUEST_CODE)
// ActivityB.kt
setResult(RESULT_OK, resultIntent)
finish()
// ActivityA.kt - 여전히 살아있어서 결과를 받을 수 있음
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// 결과 처리
}
3. LocalBroadcastManager 활용하기
LocalBroadcastManager는 앱 내부에서만 동작하는 브로드캐스트 시스템으로, 앱의 Activity 간 데이터를 전달하거나 상태를 알리기 위해 유용하게 사용됩니다. 앱 실행 중 앱 내부의 컴포넌트들끼리만 통신하게 해줍니다.
- 특징:
- 앱이 실행 중일 때만 동작합니다.
- 앱 내부 프로세스 간 통신에 사용됩니다.
- 메모리에 있는 컴포넌트들끼리만 통신할 수 있습니다.
예제: Activity 간 상태 알림에 LocalBroadcastManager 사용하기
아래 예제에서는 ReservationActivity가 백그라운드에서 포그라운드로 돌아올 때 DispatchActivity의 특정 메서드가 호출되도록 LocalBroadcastManager를 활용합니다.
- ReservationActivity에서 브로드캐스트 전송
// ReservationActivity.kt
override fun onResume() {
super.onResume()
// DispatchActivity에 포그라운드 상태 전환 알림을 보냄
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent("ACTION_RETURN_TO_FOREGROUND"))
}
2. DispatchActivity에서 브로드캐스트 수신 및 처리
// DispatchActivity.kt
private val returnToForegroundReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// Broadcast를 수신했을 때 실행할 로직
if (intent?.action == "ACTION_RETURN_TO_FOREGROUND") {
returnToForeground()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// BroadcastReceiver 등록
LocalBroadcastManager.getInstance(this)
.registerReceiver(returnToForegroundReceiver, IntentFilter("ACTION_RETURN_TO_FOREGROUND"))
}
override fun onDestroy() {
super.onDestroy()
// BroadcastReceiver 해제
LocalBroadcastManager.getInstance(this)
.unregisterReceiver(returnToForegroundReceiver)
}
위 코드는 ReservationActivity가 포그라운드로 돌아올 때 DispatchActivity에서 returnToForeground() 메서드를 호출하도록 합니다. 이렇게 LocalBroadcastManager를 활용하면 앱의 실행 중 Activity 간 상태 전환을 감지하고 처리할 수 있습니다.
'Android' 카테고리의 다른 글
[Android] FLAG_ACTIVITY_SINGLE_TOP 와 FLAG_ACTIVITY_CLEAR_TOP 차이점 (0) | 2024.11.19 |
---|---|
[Android] gradle를 활용한 firebase App distribution 배포 후 slack 알람 연동 (0) | 2024.11.17 |
[Android] 강제 업데이트 & 수동 업데이트 ? (0) | 2024.11.13 |
[Kotlin] 제네릭 (0) | 2024.11.12 |
[Android] jcenter 빌드 오류 (2) | 2024.11.09 |