다중 Activity 간 생명주기 전환
다중 Activity 간 생명주기 전환
두 개의 Activity 사이를 전환할 때 생명주기 콜백이 어떤 순서로 호출되는지 이해하는 것은 리소스 관리, 상태 보존, 그리고 화면 전환 시 시각적 결함(visual glitch) 방지에 필수적입니다. 안드로이드 시스템은 나가는 Activity와 들어오는 Activity의 생명주기 콜백을 특정 순서로 인터리빙(interleaving)합니다. 이러한 설계 덕분에 이전 Activity가 완전히 정지되기 전에 새 Activity가 먼저 준비됩니다. 면접에서 다중 Activity 전환 관련 질문은 생명주기에 대한 깊이 있는 이해를 평가하는 단골 주제이므로, 단순히 콜백 이름을 나열하는 수준이 아니라 왜 이 순서로 호출되는지까지 설명할 수 있어야 합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- Activity A에서 Activity B를 실행할 때의 정확한 콜백 순서를 추적할 수 있습니다.
- Activity A의
onStop()이 Activity B의onResume()이후에 호출되는 이유를 설명할 수 있습니다. - Activity B에서 Activity A로 돌아올 때의 콜백 순서를 구체적으로 기술할 수 있습니다.
- 정지 상태(stopped state)에서 복귀하는 경로에서
onRestart()의 역할을 식별할 수 있습니다.
Activity A에서 Activity B를 실행할 때
사용자가 Activity A에서 Activity B로 전환하는 내비게이션을 트리거하면, 시스템은 정확한 콜백 순서를 따릅니다. Activity A가 즉시 정지되는 것이 아니라, 시스템이 먼저 Activity B를 준비하여 포그라운드를 넘겨받을 수 있도록 합니다.
콜백 호출 순서는 다음과 같습니다.
- Activity A:
onPause\(\): A의 UI를 일시 중지하고, 가시 상태(visible state)에 연결된 리소스를 해제합니다. - Activity B:
onCreate\(\): B의 컴포넌트를 초기화하고 레이아웃을 인플레이트합니다. - Activity B:
onStart\(\): B가 화면에 보이기 시작합니다. - Activity B:
onResume\(\): B가 포그라운드에 진입하여 사용자 상호작용이 가능한 상태가 됩니다. - Activity A:
onStop\(\): B가 완전히 포그라운드를 차지한 후에야 A가 정지됩니다.
여기서 핵심은 A의 onStop()이 B가 완전히 onResume()까지 마친 이후로 지연된다는 점입니다. 이러한 콜백 겹침(overlap) 덕분에 전환 과정에서 사용자는 항상 완전히 렌더링된 화면을 보게 됩니다. 만약 Activity B가 반투명(translucent) 테마를 사용하거나 Activity A를 완전히 가리지 않는 경우, A의 onStop()은 아예 호출되지 않습니다. A가 여전히 부분적으로 보이는 상태이기 때문입니다.
각 콜백에 로그 구문을 추가하면 이 인터리빙 동작을 직접 확인하실 수 있습니다.
class ActivityA : AppCompatActivity() {
override fun onPause() {
super.onPause()
Log.d("Lifecycle", "A: onPause")
}
override fun onStop() {
super.onStop()
Log.d("Lifecycle", "A: onStop")
}
override fun onRestart() {
super.onRestart()
Log.d("Lifecycle", "A: onRestart")
}
}
Activity A에서 Activity B를 실행할 때 Logcat 출력을 보면, A의 onPause가 가장 먼저 나타나고, 이어서 B의 onCreate, onStart, onResume이 순서대로 출력되며, 마지막으로 A의 onStop이 출력됩니다. 이 순서는 프레임워크의 ActivityManager 서비스에 의해 보장되며, 개발자가 임의로 변경할 수 없습니다.
Activity B에서 Activity A로 돌아올 때
사용자가 Activity B에서 뒤로 내비게이션을 하여 Activity A로 돌아오면 역방향 순서로 콜백이 호출됩니다.
- Activity B:
onPause\(\): B가 포그라운드를 떠나기 시작하면서 일시 중지됩니다. - Activity A:
onRestart\(\): A가 정지 상태에서 다시 돌아오고 있음을 알려 줍니다. - Activity A:
onStart\(\): A가 다시 화면에 보이기 시작합니다. - Activity A:
onResume\(\): A가 포그라운드에 진입합니다. - Activity B:
onStop\(\): A가 완전히 복귀한 후에야 B가 정지합니다. - Activity B:
onDestroy\(\): 뒤로 내비게이션으로 인해 B가 종료되면 소멸됩니다.