구성 변경 발생
구성 변경을 발생시키는 이벤트가 몇 가지 존재한다. 아마 가장 널리 알려진 것은 화면 회전일 것이다.
다른 예로는 언어 변경 및 디바이스 입력 등이 있다. 구성 변경이 발생하면 액티비티는 소멸된 후 재생성된다. 원래의 액티비티 인스턴스에서는 onPause()
, onStop()
, onDestroy()
가 실행되고 새 인스턴스가 생성되어 onCreate()
, onStart()
, onResume()
이 실행된다.
ViewModel
, onSaveInstanceState()
, 영구 로컬 저장소를 조합해서 사용하면 구성 변경이 발생했을 때 액티비티의 UI 상태를 보존할 수 있다. 이들을 조합하는 방법은 UI 데이터의 복잡도, 앱의 사용 사례, 메모리 사용 대비 검색 속도에 따라 달라진다.
멀티 윈도우 처리
앱이 안드로이드 7.0(API 레벨 24)부터 지원되는 멀티 윈도우 모드로 전환되면 시스템은 현재 실행 중인 액티비티에 구성 변경이 발생함을 알린다. 그러고 나서 위에서 설명한 수명주기 전환이 발생한다. 이 동작은 이미 멀티 윈도우 모드에 있는 앱의 크기가 변할 때도 발생한다. 액티비티는 구성 변경을 자체적으로 처리하거나 시스템이 액티비티를 소멸시키고 재생성하게 할 수 있다.
멀티 윈도우 모드에서 2개의 앱이 사용자에게 보이더라도 포그라운드에 있으며 포커스를 가지고 사용자와 상호작용할 수 있는 것은 둘 중 하나뿐이다. 해당 액티비티는 재개됨 상태이고 다른 창의 앱은 일시중지됨 상태이다.
사용자가 앱 A에서 앱 B로 전환하면 시스템이 앱 A의 onPause()와 앱 B의 onResume()을 호출한다.
두 앱을 전환할 때마다 이와 같은 동작이 발생한다.
액티비티나 다이얼로그가 포그라운드에 나타날 때
새 액티비티나 다이얼로그가 포그라운드로 나와서 포커스를 가지고 실행 중인 액티비티를 부분적으로 가리면 가려진 액티비티는 포커스를 잃고 일시중지됨 상태에 진입한다. 그러면 시스템이 가려진 액티비티의 onPause()
를 호출한다.
가려졌던 액티비티가 포그라운드로 돌아와 포커스를 다시 얻으면 onResume()
이 호출된다.
새 액티비티나 다이얼로그가 포그라운드에 나와 포커스를 가지고 실행 중인 액티비티를 완전히 가리면 가려진 액티비티는 포커스를 잃고 중단됨 상태에 진입한다. 그러면 시스템은 가려진 액티비티의 onPause()
와 onStop()
을 호출한다.
가려진 액티비티와 동일한 인스턴스가 포그라운드로 돌아오면 시스템이 onRestart()
, onStart()
, onResume()
을 호출한다. 백그라운드에 있는 가려진 액티비티와 다른 새 인스턴스인 경우 onRestart()
는 호출되지 않고 onStart()
와 onResume()
만 호출된다.
사용자가 최근 사용한 앱 또는 홈 버튼을 누르면 시스템은 현재 액티비티가 완전히 가려진 것처럼 동작한다.
사용자가 뒤로 가기 버튼을 누름
액티비티가 포그라운드에 있고 사용자가 뒤로 가기 버튼을 누르면 액티비티는 onPause()
, onStop()
, onDestroy()
콜백을 거쳐 수명주기가 전환된다. 액티비티는 소멸되면 백 스택에서도 제거된다.
액티비티가 루트 런처 액티비티일 경우 이벤트가 처리되는 방법은 디바이스가 실행하고 있는 안드로이드 버전에 따라 달라진다.
이러한 경우 기본적으로 onSaveInstanceState()
는 실행되지 않는다. 이 동작은 사용자가 동일한 액티비티 인스턴스로 돌아오지 않을 것이라는 가정을 기반으로 한다. 하지만 onBackPressed()
를 재정의하면 사용자 정의 동작을 구현할 수 있다. 예를 들면 사용자가 앱에서 나가려 할 때 확인하는 다이얼로그를 표시하도록 할 수 있다.
onBackPressed()
를 재정의한다면 상위 클래스의 구현을 호출하는 것을 강력히 권장한다.
그렇지 않으면 뒤로 가기 동작은 사용자에게 부자연스럽게 보일 수 있다.
시스템에 의한 앱 프로세스 종료
앱이 백그라운드에 있고 시스템이 포그라운드 앱을 위해 추가적으로 메모리를 확보해야 한다면 백그라운드 앱은 시스템에 의해 종료될 수 있다.
'Android' 카테고리의 다른 글
액티비티 (5) : 태스크와 백 스택 (0) | 2022.05.11 |
---|---|
액티비티 (4) : 액티비티 테스트 (0) | 2022.05.09 |
액티비티 (2) : 액티비티의 수명 주기 (0) | 2022.04.08 |
액티비티 (1) : 액티비티 만들기 (0) | 2022.04.06 |
인텐트 (2) : 보류 인텐트 (0) | 2022.04.05 |