Android/StoreInfo

activity lifecycle에 관한 이해

re트 2023. 12. 12. 16:08
728x90

사용자가 앱을 탐색하고, 앱에서 나가고, 앱으로 다시 돌아가는 등의 행동을 하면 앱의 Activity 인스턴스는 자신의 lifecycle 안에서 서로 다른 상태를 통해 전환된다.

 

Activity 클래스는 activity가 상태 변화를 알아차릴 수 있는 여러 콜백 메서드를 제공한다.

각 콜백 메서드는 상태 변화에 적합한 특정 작업을 실행할 수 있게 해준다.

적시에 알맞은 작업을 하고 적절하게 전환을 처리하면 앱이 더욱 안정적으로 기능할 수 있다.

 

lifecycle 콜백 메서드를 잘 구현하면 앱에서 다음과 같은 문제가 발생하지 않도록 예방하는 도움이 될 수 있다.

  - 사용자가 앱을 사용하는 도중에 전화가 걸려오거나 다른 앱으로 전환할 때, 앱이 비정상 종료되는 문제

  - 사용자가 앱을 활발하게 사용하지 않을 때, 귀중한 시스템 리소스가 낭비되는 문제

  - 사용자가 앱에서 나갔다가 나중에 돌아왔을 때, 사용자의 진행 상태가 저장되지 않는 문제

  - 화면이 가로 방향과 세로 방향 간에 회전할 경우, 비정상 종료되거나 사용자의 진행 상태가 저장되지 않는 문제

 

Activity-lifecycle 개념

activity lifecycle의 각 단계 간에 전환을 위해 Activity 클래스는 6가지 콜백 메서드로 구성된 핵심 집합을 제공한다.

  - onCreate()

  - onStart()

  - onResume()

  - onPause()

  - onStop()

  - onDestroy()

activity가 새로운 상태에 들어가면 시스템은 각 콜백 메서드를 호출한다.

 

- 사용자가 activity를 벗어나기 시작하면 시스템은 activity를 해체할 메서드를 호출한다. 이때 activity는 여전히 메모리 안에 남아 있으며 포그라운드로 다시 돌아올 수 있다.

- 어떤 경우에는 부분적으로만 해체하기도 한다.

- 사용자가 해당 activity로 돌아오는 경우 사용자가 종료한 지점부터 activity가 다시 시작된다.

- 몇 가지 예외사항을 제외하고는 앱은 백그라운드에서 실행될 때 activity를 실행할 수 없다.

- 시스템은 그 시점의 activity 상태에 따라 특정 프로세스와 그 안의 activity를 함께 종료할지 여부를 결정한다.

- activity의 복잡도에 따라서 모든 lifecycle 콜백 메서드를 구현할 필요가 없는 경우도 있다. 하지만 각각의 lifecycle 콜백 메서드를 이해하고, 사용자가 예상한 대로 앱이 동작하도록 필요한 lifecycle 콜백 메서드를 구현하는 것이 중요하다.

 

Lifecycle 콜백 메서드

onCreate()

    시스템이 activity를 생성할 때 가장 먼저 실행되는 콜백 메서드로써 필수로 구현해야한다.

 

- activity가 생성되면 'Created' 상태가 됨

- activity의 전체 lifecycle동안 한 번만 발생해야 하는 기본 애플리케이션 시작 로직을 실행

- activity의 이전 저장 상태가 포함된 Bundle 객체인 savedInstanceState를 매개변수로 수신

- 처음 생성된 activity인 경우 Bundle 객체의 값은 null

 

- activity의 lifecycle과 연결된 lifecycle 인식 구성요소가 있다면 이 구성요소는 ON_CREATE 이벤트를 수신해서 @OnLifecycleEvent라는 주석이 있는 메서드가 호출되고, 'Created' 상태에 필요한 모든 설정 코드를 실행 가능

- onCreate() 콜백 메서드가 실행을 완료하면 'Started' 상태가 되고, 시스템은 연달아 onStart()와 onResume() 콜백 메서드를 호출

 

onStart()

    activity가 'Started' 상태에 들어갈 때 시스템이 호출하는 콜백 메서드

 

- onStart()가 호출되면 activity가 사용자에게 표시되고 앱은 activity를 포그라운드에 보내 상호작용할 수 있도록 준비

 

- activity가 'Started' 상태로 전환하면 이 activity의 lifecycle과 연결된 모든 lifecycle 인식 구성요소는 ON_START 이벤트를 수신

 

- onStart() 콜백 메서드는 매우 빠르게 완료됨

- onStart() 콜백 메서드가 완료되면 activity는 'Resumed' 상태에 들어가고, 시스템은 onResume() 콜백 메서드를 호출

 

onResume()

    activity가 'Resumed' 상태에 들어가면 포그라운드에 표시되고 시스템은 onResume() 콜백 메서드를 호출한다.

 

- 이 상태에 들어갔을 때, 앱은 사용자와 상호작용

- 어떤 이벤트가 발생하여 앱에서 포커스가 떠날 때까지 앱은 이 상태에 머무름

 

- activity가 'Resumed' 상태로 전환되면 이 activity의 lifecycle과 연결된 모든 lifecycle 인식 구성요소는 ON_RESUME 이벤트를 수신

- 이 상태에서 lifecycle 구성요소는 포그라운드에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화 가능

 

- 방해되는 이벤트가 발생하면 activity는 'Paused' 상태에 들어가고, 시스템은 onPause() 콜백 메서드를 호출

- activity가 'Paused' 상태에서 'Resumed' 상태로 돌아오면 시스템은 onResume() 메서드를 다시 한번 호출하기 때문에 onPause() 중에 해제하는 구성요소를 초기화하고, activity가 'Resumed' 상태로 전환될 때마다 필요한 다른 초기화 작업도 수행해야 함

 

onPause()

    시스템은 사용자가 activity를 떠나는 것을 나타내는 첫 번째 신호로 이 콜백 메서드를 호출한다.(하지만 해당 activity가 항상 소멸되는 것은 아님)

 

- activity가 포그라운드에 있지 않게 되었다는 것을 나타냄

- 사용자가 멀티 윈도우 모드에 있을 경우에는 여전히 포그라운드에 표시 될 수도 있음

- onPause() 메서드를 사용하여 Activity가 'Paused' 상태일 때에 계속 실행되어서는 안 되지만 잠시 다시 시작할 작업을 일시중지하거나 조정

 

- activity가 이 상태에 들어가는 이유

  - 일부 이벤트가 앱 실행을 방해

  - Android 7.0(API 수준 24) 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행되는데 언제든지 그중 하나의 앱만 포커스를 가질 수 있기 때문에 시스템이 그 외에 모든 다른 앱을 일시중지시킴

  - 새로운 반투명 activity가 열려서 activity가 여전히 부분적으로 보이지만 포커스 상태가 아닌 경우에는 'Paused' 상태로 유지

 

- activity가 'Paused' 상태로 전환하면 이 activity의 lifecycle과 연결된 모든 lifecycle 인식 구성요소는 ON_PAUSE 이벤트를 수신

- 여기에서 lifecycle 인식 구성요소는 구성요소가 포그라운드에 있지 않을 때 실행할 필요가 없는 기능을 모두 정지 가능

 

- onPause() 메서드를 사용하여 시스템 리소스, 센서 핸들 또는 activity가 'Paused' 상태이고 사용자가 필요로 하지 않을 때 배터리 수명에 영향을 미칠 수 있는 모든 리소스를 해제 가능

- 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI 관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 onStop()을 사용하는 것이 좋음

- onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족할 수 있으므로 onPause()를 사용하여 애플리케이션 또는 사용자 데이터를 저장하거나, 네트워크 호출을 하거나, 데이터베이스 트랜잭션을 실행하서는 안 됨

- 부하가 큰 종료 작업은 onStop() 동안에 실행 추천

 

- onPause() 메서드의 실행이 완료되더라도 activity가 'Paused' 상태로 남아있을 수 있음

- 오히려 activity는 다시 시작되거나 사용자에게 완전히 보이지 않을 때까지 이 상태에 머무름

- activity가 다시 시작되면 시스템은 다시 한번 onResume() 콜백 메서드를 호출

- activity가 'Paused' 상태에서 'Resumed' 상태로 돌아오면 시스템은 Activity 인스턴스를 메모리에 남겨두고, 시스템이 onResume()을 호출할 때 인스턴스를 다시 호출

- 이 시나리오에서는 최상위 상태가 'Resumed' 상태인 콜백 메서드 중에 생성된 구성요소는 다시 초기화할 필요없음

- activity가 완전히 보이지 않게 되면 시스템은 onStop() 콜백 메서드를 호출

 

onStop()

    activity가 사용자에게 더 이상 표시되지 않으면 'Stopped' 상태에 들어가고 시스템은 onStop() 콜백 메서드를 호출한다.

 

- 시스템은 activity의 실행이 완료되어 종료될 시점에 onStop()을 호출 가능

 

- activity가 'Stopped' 상태로 전환하면 이 activity의 lifecycle과 연결된 모든 lifecycle 인식 구성요소는 ON_STOP 이벤트를 수신

- lifecycle 인식 구성요소는 구성요소가 화면에 보이지 않을 때 실행할 필요가 없는 기능을 모두 정지 가능

 

- onStop() 메서드에서는 앱이 사용자에게 보이지 않는 동안 앱은 필요하지 않은 리소스를 해제하거나 조정해야함

- onPause() 대신 onStop()을 사용하면 사용자가 멀티 윈도우 모드에서 activity를 보고 있더라도 UI 관련 작업이 계속 진행됨

- onStop()을 사용하여 CPU를 비교적 많이 소모하는 종료 작업을 실행해야함

 

- activity가 'Stopped' 상태에 들어가면 Activity 객체는 메모리 안에 머무르게 됨

- 이 객체가 모든 상태 및 멤버 정보를 관리하지만 창 관리자와 연결되어 있지는 않음

- activity가 다시 시작되면 위의 정보를 다시 호출

- 최상위 상태가 'Resumed' 상태인 콜백 메서드 중에 생성된 구성요소는 다시 초기화할 필요 없음

- 시스템은 레이아웃에 있는 각 View 객체의 현재 상태도 기록하기 때문에 사용자가 EditText 위젯에 텍스트를 입력하면 해당 내용이 저장되기 때문에 이를 저장 및 복원할 필요없음

- activity는 'Stopped' 상태에서 다시 시작되어 사용자와 상호작용하거나, 실행을 종료하고 사라짐

- activity가 다시 시작되면 시스템은 onRestart()를 호출하고 실행을 종료하면 onDestroy()를 호출

 

onDestroy()

    activity가 소멸되기 전에 호출되는 콜백 메서드

시스템은 다음 중 하나에 해당할 때 이 콜백 메서드를 호출한다.

  - 사용자가 activity를 완전히 닫거나 activity에서 finish()가 호출되어 activity가 종료되는 경우

  - 구성 변경으로 인해 시스템이 일시적으로 activity를 소멸시키는 경우

 

- activity가 'destroyed' 상태로 전환하면 이 activity의 lifecycle과 연결된 모든 lifecycle 인식 구성요소는 ON_DESTROY 이벤트를 수신

- lifecycle 인식 구성요소는 activity가 소멸되기 전에 필요한 것을 정리 가능

 

- Activity에 소멸되는 이유를 결정하는 로직을 입력하는 대신 ViewModel 객체를 사용하여 Activity의 관련 뷰 데이터를 포함해야함

- Activity가 구성 변경으로 인해 다시 생성될 경우 ViewModel은 그대로 보존되어 다음 Activity 인스턴스에 전달되므로 추가 작업이 필요없음

- Activity가 다시 생성되지 않을 경우 ViewModel은 onCleared() 메서드를 호출하여 Activity가 소멸되기 전에 모든 데이터를 정리해야함

- 위의 두가지 시나리오는 isFinishing() 메서드로 구분 가능

 

- activity가 종료되는 경우 onDestroy()는 activity가 수신하는 마지막 lifecycle 콜백 메서드

- 구성 변경으로 인해 onDestroy()가 호출되는 경우 시스템이 즉시 새 activity 인스턴스를 생성한 다음, 새로운 구성에서 그 새로운 인스턴스에 관해 onCreate()를 호출

- onDestroy() 콜백 메서드는 이전의 콜백에서 아직 해제되지 않은 모든 리소스를 해제해야함

 

Activity 상태 및 메모리에서 제거

시스템은 RAM에 여유 공간이 필요할 때 프로세스를 종료한다.

시스템이 특정 프로세스를 종료할 가능성은 그 시점의 프로세스 상태에 따라 달라진다.

그리고 프로세스 상태는 프로세스에서 실행되는 activity 상태에 따라 달라짐

종료될 가능성 프로세스 상태 액티비티 상태
최소 포그라운드(포커스가 있거나 포커스를 가져올 예정) Resumed(생성됨, 시작됨, 재개됨)
더보기 백그라운드(포커스 상실) Started / Paused(일시중지됨)
최대 백그라운드(보이지 않음) Stopped(중지됨)
  비우기 Destroyed(소멸됨)

 

- 시스템은 메모리 공간을 확보하기 위해 절대 activity를 직접 종료하지 않음

- activity를 실행하는 프로세스를 종료하여 activity 뿐만 아니라 프로세스에서 실행되는 다른 모든 작업을 함께 소멸시킴

- 사용자도 설정의 애플리케이션 관리자를 사용하여 해당 앱을 종료하는 방법으로 프로세스를 종료 가능

반응형