본문 바로가기
Android

[Android] Activity 스택 관리와 LocalBroadcastManager 활용하기

by 박매트 2024. 11. 14.

이 글은 안드로이드에서 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를 활용합니다.

  1. 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 간 상태 전환을 감지하고 처리할 수 있습니다.