일부 사용자에 의해 트리거되고 일부 시스템에 의해 트리거되는 다양한 이벤트로 인해 Activity
가 한 상태에서 다른 상태로 전환될 수 있습니다. 이 문서에서는 이러한 전환이 발생하는 일반적인 사례 및 전환을 처리하는 방법을 설명합니다.
활동 상태에 관한 자세한 내용은 활동 수명 주기 이해를 참조하세요. ViewModel
클래스가 활동 수명 주기를 관리하는 데 어떻게 도움이 되는지 알아보려면 ViewModel 클래스 이해를 참조하세요.
구성 변경 발생
구성 변경을 트리거할 수 있는 여러 이벤트가 있습니다. 아마도 가장 눈에 잘 띄는 예는 세로 모드와 가로 모드 간 방향 변경일 것입니다. 구성 변경을 일으킬 수 있는 다른 사례로는 언어 또는 입력 기기 변경이 있습니다.
구성 변경이 발생하면 활동이 제거되고 다시 생성됩니다.
원래 활동 인스턴스에서는 onPause()
, onStop()
및 onDestroy()
콜백이 트리거됩니다. 그리고 활동의 새 인스턴스가 생성되고 이 인스턴스에는 onCreate()
, onStart()
및 onResume()
콜백이 트리거됩니다.
ViewModel, onSaveInstanceState() 메서드 또는 영구 로컬 저장소의 조합을 활용하면 구성 변경 전체에 걸쳐 활동의 UI 상태를 유지할 수 있습니다. 이러한 옵션을 조합하는 방법은 UI 데이터의 복잡성, 앱 사용 사례 및 메모리 사용량 대비 검색 속도를 고려하여 결정해야 합니다. 활동 UI 상태 저장에 관한 자세한 내용은 UI 상태 저장을 참조하세요.
멀티 윈도우 처리 사례
앱이 Android 7.0(API 레벨 24) 이상에서 제공되는 멀티 윈도우 모드로 전환되면 시스템은 현재 실행 중인 활동에 구성 변경을 알립니다. 이에 따라 위에서 설명한 수명 주기 전환을 거치게 됩니다. 이미 멀티 윈도우 모드에 있는 앱의 크기가 조정될 때도 이 동작이 발생합니다. 활동은 구성 변경을 직접 처리하거나 시스템이 활동을 제거하고 새 측정기준으로 활동을 다시 생성하도록 허용할 수 있습니다.
멀티 윈도우 수명 주기에 관한 자세한 내용은 멀티 윈도우 지원 페이지의 멀티 윈도우 수명 주기 섹션을 참조하세요.
멀티 윈도우 모드에서는 사용자에게 표시되는 앱이 두 개 있더라도 사용자가 상호작용하고 있는 앱만 포그라운드에 있으며 포커스를 가집니다. 이 활동은 '다시 시작됨' 상태이지만 다른 창의 앱은 '일시중지됨' 상태입니다.
사용자가 앱 A에서 앱 B로 전환할 때 시스템은 앱 A에 onPause()
를 호출하고 앱 B에 onResume()
을 호출합니다. 사용자가 앱을 전환할 때마다 두 메서드가 전환됩니다.
멀티 윈도우 처리에 관한 자세한 내용은 멀티 윈도우 지원을 참조하세요.
활동 또는 대화상자가 포그라운드로 나옴
새 활동 또는 대화상자가 포그라운드로 나옴에 따라 포커스를 얻고 진행 중인 활동을 부분적으로 가리면 가려진 활동은 포커스를 잃고 '일시중지됨' 상태로 전환됩니다. 그러면 시스템은 그 활동에 onPause()
를 호출합니다.
가려진 활동이 포그라운드로 돌아와서 포커스를 다시 얻으면 시스템은 onResume()
을 호출합니다.
새 활동 또는 대화상자가 포그라운드로 나옴에 따라 포커스를 얻고 진행 중인 활동을 완전히 가리면 가려진 활동은 포커스를 잃고 '중지됨' 상태로 전환됩니다. 그러면 시스템은 onPause()
및 onStop()
을 빠르게 연속적으로 호출합니다.
가려진 활동의 동일한 인스턴스가 포그라운드로 다시 돌아오면 시스템은 활동에 onRestart()
, onStart()
및 onResume()
을 호출합니다.
인스턴스가 백그라운드로 전환된 가려진 활동의 새 인스턴스이면 시스템은 onRestart()를 호출하지 않고 onStart()
및 onResume()
만 호출합니다.
참고: 사용자가 최근 사용 또는 홈 버튼을 탭하면 시스템은 현재 활동이 완전히 가려진 것처럼 동작합니다.
사용자가 뒤로 버튼을 탭함
활동이 포그라운드에 있는데 사용자가 뒤로 버튼을 탭하면 활동은 onPause()
, onStop()
및 onDestroy()
콜백을 거치며 전환됩니다. 또한 활동은 제거될 뿐만 아니라 백 스택에서도 삭제됩니다.
이런 상황에서는 기본적으로 onSaveInstanceState()
콜백이 실행되지 않는다는 점에 유의해야 합니다. 이 동작은 사용자가 활동의 동일한 인스턴스로 돌아올 것으로 예상하지 않고 뒤로 버튼을 탭했다는 가정을 기반으로 합니다. 그러나 onBackPressed()
메서드를 재정의하면 'confirm-quit' 대화상자와 같은 일부 맞춤 동작을 구현할 수 있습니다.
onBackPressed()
메서드를 재정의할 때는 재정의한 메서드에서 super.onBackPressed()
를 호출하는 것이 좋습니다. 호출하지 않으면 뒤로 버튼 동작이 사용자에게 부자연스럽게 보일 수 있습니다.
시스템이 앱 프로세스를 종료함
앱이 백그라운드에 있는데 시스템이 포그라운드 앱을 위해 추가 메모리를 확보해야 하면 시스템은 더 많은 메모리를 확보하기 위해 백그라운드 앱을 종료할 수 있습니다. 시스템이 제거할 프로세스를 결정하는 방식에 관해 자세히 알아보려면 활동 상태 및 메모리에서 방출과 프로세스 및 애플리케이션 수명 주기를 참조하세요.
시스템이 앱 프로세스를 종료할 때 활동 UI 상태를 저장하는 방법을 알아보려면 활동 상태 저장 및 복원을 참조하세요.