활동 상태 변경

일부 사용자에 의해 트리거되고 일부 시스템에 의해 트리거되는 다양한 이벤트로 인해 Activity가 한 상태에서 다른 상태로 전환될 수 있습니다. 이 문서에서는 이러한 전환이 발생하는 몇 가지 일반적인 사례와 이러한 전환을 처리하는 방법을 설명합니다.

활동 상태에 관한 자세한 내용은 활동 수명 주기를 참고하세요. ViewModel 클래스가 활동 수명 주기를 관리하는 데 어떻게 도움이 되는지 알아보려면 ViewModel 개요를 참고하세요.

구성 변경 발생

구성 변경을 트리거할 수 있는 여러 이벤트가 있습니다. 아마도 가장 눈에 띄는 예는 세로 모드 방향과 가로 모드 방향 간의 변경일 것입니다. 구성 변경을 일으킬 수 있는 다른 예로는 언어 설정 또는 입력 기기 변경이 있습니다.

구성 변경이 발생하면 활동이 제거되고 다시 생성됩니다. 이렇게 하면 원래 활동 인스턴스에서 다음과 같은 콜백이 트리거됩니다.

  1. onPause()
  2. onStop()
  3. onDestroy()

활동의 새 인스턴스가 생성되고 다음 콜백이 트리거됩니다.

  1. onCreate()
  2. onStart()
  3. 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() 메서드를 재정의하여 사용자에게 앱을 종료할 것인지 확인하는 대화상자를 표시하는 것과 같은 맞춤 동작을 구현할 수 있습니다.

onBackPressed() 메서드를 재정의하는 경우에도 재정의된 메서드에서 super.onBackPressed()를 호출하는 것이 좋습니다. 그러지 않으면 시스템 뒤로 동작이 사용자에게 부자연스럽게 느껴질 수 있습니다.

시스템이 앱 프로세스를 종료함

앱이 백그라운드에 있고 시스템에서 포그라운드 앱을 위해 메모리를 확보해야 하는 경우 시스템은 백그라운드 앱을 종료할 수 있습니다. 시스템이 앱을 종료할 때 앱에서 onDestroy()이 호출된다는 보장이 없습니다.

시스템이 어떤 프로세스를 삭제할지 결정하는 방법을 자세히 알아보려면 활동 상태 및 메모리에서 제거프로세스 및 앱 수명 주기를 참고하세요.

시스템에서 앱 프로세스를 종료할 때 활동 UI 상태를 저장하는 방법을 알아보려면 일시적인 UI 상태 저장 및 복원을 참고하세요.