Android Activity의 생명주기

김재원·2022년 4월 26일
0
post-thumbnail

안드로이드를 개발하다보면 생명주기(lifecycle)에 대해 알아야하는 상황이 많이 생깁니다. 생명주기는 사용자가 앱을 껏는지, 잠시 다른 앱을 켰는지 등을 판단할 수 있는 방법이 되기 때문에 꼭 필요한 개념인데, 이 생명주기는 Activity는 물론이고, Fragment, viewmodel 등에도 있습니다. 지금부터 각각의 생명주기들에 대해 알아보고자 합니다.

Activity의 생명주기

Activity 클래스는 6가지 생명주기에 대해 콜백을 제공합니다.
아래그림은 콜백의 전반적인 흐름을 정리한 그림입니다.

각각 6가지 생명주기들은 다음과 같습니다.(onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy())

onCreate()

상태: ON_CREATE
이 함수는 시스템이 Activity를 생성할 때 실행하는 것으로, 필수적으로 구현해야 합니다.

onCreate함수에서는 Activity의 생명 주기 동안 한 번만 발생해야 하는 로직을 실행합니다. 예를 들어 ViewModel과 연결하거나, recyclerViewAdapter연결 setOnclickListener 구현 등을 할 수 있습니다.

onCreate는 Bundle 객체인saveInstanceState를 매개변수로 받습니다. 이것에는 Activity의 이전 저장상태가 저장되어 있습니다. 만약 Activity가 처음 실행되었다면 saveInstanceState는 null입니다.

onStart()

상태: ON_START
이 함수가 호출되면 Activity가 사용자에게 표시됩니다. 앱은 Activity를 포그라운드에 보내 상호작용할 수 있도록 준비합니다.

onRestart()이 호출되고 난 후에도 호출됩니다.

ON_START이후에 초기화 한 것이 있는 경우 ON_STOP이후 이를 해제하거나 종료해야합니다.

이 함수는 매우 빠르게 완료되고, 이 함수가 완료되면 Activity가 재개됨 상태에 들아갑니다(onResume()호출).

onResume()

상태: ON_RESUME
이 함수가 시작되면 Activity가 사용자와 상호작용합니다.

어떤 이벤트(전화가 옴, 사용자가 다른 Activity로 이동함, 기기 화면이 꺼짐 등)가 발생하여 앱에서 포커스가 떠날 때까지 이 상태에 머무릅니다.

ON_RESUME이후에 초기화한 것이 있을 경우 ON_PAUSE이후에 이를 해체해야합니다.

방해되는 이벤트가 발생하면 ON_PAUSE상태로 변경됩니다(onPause()호출).
ON_PAUSE상태에서 다시 ON_RESUME상태로 돌아올 때 onResume()함수가 실행됩니다.

onPause()

상태: ON_PAUSE
사용자가 Activity를 떠나는 것에대한 첫번째 신호입니다. ON_PAUSE상태는 Activity가 포그라운드에 있지 않음을 표시합니다(다만, 멀티 윈도우 모드에서는 계속 표시될 수 있음). 이 상태에서는 사용자가 Activity와 상호작용하지 않습니다.

이 상태가 되면 배터리 수명등에 영향을 줄 수있는 리소스들을 해제할 수 있습니다. 하지만 onPause()에는 멀티윈도우등 여전히 화면에 표시될 수 있는 상황이 있기 때문에 완전히 해제할 때는 onStop()에서 하는 것이 좋습니다.

onPause()는 아주 잠깐 실행됩니다. 따라서 저장 작업을 실행하기에는 시간이 부족할 수 있습니다. 따라서 다음 작업들은 onPause()에서 실행하면 안됩니다.

  • 데이터 저장
  • 네트워크 호출
  • 데이터베이스 트랜잭션

위와같이 부하가 큰 종료작업은 onStop()일 때 하는 것이 좋습니다.

onStop()

상태: ON_STOP
Activity가 더 이상 표시되지 않는 상태입니다. Activity가 화면에서 보이지않는 상태는 다음과 경우들이 있을 수 있습니다.

  • 새로 시작된 Activity가 화면 전체를 덮은 경우
  • Activity가 완료되어 종료된 경우 등

이 경우 시스템은 onStop() 콜백을 호출합니다.

이 상태에서는 앱이 사용자에게 보이지 않는 동안 필요하지 않은 리소스를 해제하거나 조정해야합니다.

  • 애니매이션 일시정지
  • 세밀한 위치 업데이트에서 대략적인 위치 업데이트 등

ON_RESUME에서 설명했던 부하가 큰 종료작업들을 onStop()에서 해야합니다.

사용자가 Activity로 다시 돌아오면 onRestart()가 호출됩니다.
Activity가 실행을 종료하면 onDestroy()를 호출합니다.

onDestroy()

상태: ON_DESTROY
Activity가 소멸되기 전에 호출됩니다. Activity가 소멸되는 경우는 다음과 같습니다.

  • Activity가 종료된 경우(Activity에서 finish()가 호출되거나 사용자가 Activity를 완전히 닫았을 때)
  • 구성변경으로 시스템이 일시적으로 Activity를 소멸시키는 경우(기기 회전, 멀티 윈도우 모드 등)

onDestroy()에서는 onStop()에서 마저 해제하지 못한 리소스들을 해제해야합니다.

LifecycleObserver

생명주기에 따라 무언가를 초기화하고 해제하는등의 작업을 할 때는 콜백함수안에서 실행하는 것보다 LifecycleObserver를 통해 작업하는 것을 권장합니다.

다른 Activity 시작

A Activity가 B Activity를 시작하였을 때 발생하는 작업 순서는 아래와 같습니다.

  1. A Activity의 onPause() 메서드가 실행됩니다.
  2. B Activity의 onCreate(),onStart(),onResume 메서드가 순차적으로 실행됩니다.(포커스는 B Activity에 있습니다.)
  3. A Activity가 화면에 보이지 않는 경우 A Activity의 onStop()메서드가 실행됩니다.

이렇게해서 Activity의 생명주기에 대해 알아보았습니다. 다음글에서는 Fragment의 생명주기에 대해 알아보도록 하겠습니다.

참고
Activity 수명 주기에 관한 이해

profile
항상 배울 것을 찾는 개발자입니다🔥.

0개의 댓글