Primary/Android

[Android Fundamentals] Activity - 4. State changes

해스끼 2024. 7. 18. 14:22

사용자 이벤트나 시스템 이벤트에 의해 ``Activity``의 state가 바뀔 수 있다. 이번 글에서는 state가 바뀌는 대표적인 상황을 알아보고, state 변화에 대응하는 방법을 공부해 보자.

Configuration change

Configuration change를 일으키는 이벤트는 매우 많다. 대표적으로 화면 방향을 바꾸는 경우가 있고, 그 외에 언어나 입력 장치를 바꾸는 경우가 있다.

 

Configuration change가 발생하면 activity는 destroy된 후 다시 만들어진다. Destroy 과정에서는 다음 콜백이 실행된다.

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

새 activity 인스턴스가 만들어질 때에는 다음 콜백이 실행된다.

  1. ``onCreate()``
  2. ``onStart()``
  3. ``onResume()``

``ViewModel``, ``onSaveInstanceState()`` 함수와 로컬 저장소를 조합하여 activity의 UI state를 보존하자. 데이터의 복잡도, 앱에서의 use case, 복원 속도 등을 고려하여 적절한 저장 방법을 선택하자.

멀티 윈도우

안드로이드에서 여러 앱을 동시에 띄우는 멀티 윈도우 기능을 사용하면, 시스템에서 activity에 configuration change 발생 알림을 보낸다. 따라서 위의 순서대로 콜백이 실행된다.

 

멀티 윈도우 상황에서 창 크기를 조절했을 때에도 configuration change가 발생한 것으로 취급된다. Activity 자체적으로 configuration change에 대응할 수도 있고, 시스템이 activity를 destroy한 후 다시 만들게 할 수도 있다. 자세한 내용은 multi-window lifecycle(링크)를 참고하자.

 

멀티 윈도우 상황에서는 여러 앱이 동시에 사용자에게 보이지만, 그 중 하나의 앱만이 사용자와 상호작용할 수 있다. 사용자와 상호작용하는 앱만 Resumed 상태이고, 나머지 앱은 Paused 상태이다.

 

사용자가 앱 A를 사용하고 있다가 앱 B를 사용하면, A의 ``onPause()``와 B의 ``onResume()``가 실행된다. 사용자가 다른 앱을 사용할 때마다 ``onPause()``와 ``onResume()`` 콜백이 실행된다.

Activity나 dialog가 포그라운드에 보임

새 activity 혹은 dialog가 나타나 기존 activity를 일부 가리면, 가려진 activity는 포커스를 잃고 Paused 상태로 들어간다. 그 후 ``onPause()``가 실행된다. 가려진 activity가 다시 포커스를 얻게 되면 ``onResume()``가 실행된다. 

 

새 activity 혹은 dialog가 기존 activity를 완전히 가리면, 가려진 activity는 사용자에게 보이지 않게 되므로 Stopped 상태가 되고, ``onPause()``와 ``onStop()`` 콜백이 실행된다.

 

Stopped 상태였던 인스턴스가 다시 포커스를 얻게 되면 ``onRestart()``, ``onStart()``, ``onResume()`` 콜백이 실행된다. 가려진 activity의 새 인스턴스가 사용자에게 보이는 경우에는 ``onRestart()``를 제외한 나머지 2개만 실행한다.

 

사용자가 기기의 홈 버튼을 누르는 경우는 activity가 완전히 가려진 것으로 간주된다.

버튼/제스쳐를 통해 뒤로 가기 작업을 실행

``뒤로 가기`` 버튼은 기기의 ← 버튼을 누르거나 뒤로 가기 제스쳐로 실행할 수 있다. 

 

포그라운드 activity에서 뒤로 가기 작업을 수행하면 ``onPause()``, ``onStop()``, ``onDestroy()`` 콜백이 실행되고, activity가 destroy되어 back stack에서 제거된다.

 

Root launcher activity에서 뒤로 가기 작업을 수행하면 안드로이드 버전에 따라 서로 다른 결과가 나타난다.

  • Android 11 이하: Activity가 완전히 종료된다.
  • Android 12 이상: Activity가 종료되는 대신, 홈 버튼을 눌렀을 때처럼 백그라운드로 이동한다. 사용자가 앱을 다시 실행하고 싶을 때 빠르게 재시작할 수 있도록 백그라운드로 옮기는 것.

``onBackPressed()`` 함수를 오버라이딩하면 뒤로 가기 버튼을 눌렀을 때의 작업을 바꿀 수 있다. 이 함수에서 ``앱을 종료하려면 한 번 더 누르세요`` 메시지를 띄울 수 있다. 하지만 이 함수를 오버라이딩하더라도 ``super.onBackPressed()`` 함수는 꼭 실행하자. 어쨌든 사용자가 나갈 수 있어야 하니까.

시스템에 의해 프로세스가 종료됨

포그라운드 앱이 사용할 메모리가 부족하다면, 시스템은 백그라운드 앱을 종료할 수 있다. 시스템이 앱을 kill하는 경우에는 ``onDestroy()``가 실행된다는 보장이 없다.

 

``ViewModel``, ``onSaveInstanceState()``, 로컬 저장소를 조합하여 UI state를 보존해야 한다.

참고자료

 

활동 상태 변경  |  Android Developers

활동은 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기와 같은 작업을 하기 위해 상호작용할 수 있는 화면을 제공하는 애플리케이션 구성요소입니다. 각 활동에는 사용자 인터페

developer.android.com