안드로이드를 개발하다보면 생명주기(lifecycle)에 대해 알아야하는 상황이 많이 생깁니다. 생명주기는 사용자가 앱을 껏는지, 잠시 다른 앱을 켰는지 등을 판단할 수 있는 방법이 되기 때문에 꼭 필요한 개념인데, 이 생명주기는 Activity는 물론이고, Fragment, viewmodel 등에도 있습니다. 지금부터 각각의 생명주기들에 대해 알아보고자 합니다.
Activity 클래스는 6가지 생명주기에 대해 콜백을 제공합니다.
아래그림은 콜백의 전반적인 흐름을 정리한 그림입니다.
각각 6가지 생명주기들은 다음과 같습니다.(onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy())
상태: ON_CREATE
이 함수는 시스템이 Activity를 생성할 때 실행하는 것으로, 필수적으로 구현해야 합니다.
onCreate함수에서는 Activity의 생명 주기 동안 한 번만 발생해야 하는 로직을 실행합니다. 예를 들어 ViewModel과 연결하거나, recyclerViewAdapter연결 setOnclickListener 구현 등을 할 수 있습니다.
onCreate는 Bundle 객체인saveInstanceState
를 매개변수로 받습니다. 이것에는 Activity의 이전 저장상태가 저장되어 있습니다. 만약 Activity가 처음 실행되었다면 saveInstanceState
는 null입니다.
상태: ON_START
이 함수가 호출되면 Activity가 사용자에게 표시됩니다. 앱은 Activity를 포그라운드에 보내 상호작용할 수 있도록 준비합니다.
onRestart()
이 호출되고 난 후에도 호출됩니다.
ON_START
이후에 초기화 한 것이 있는 경우 ON_STOP
이후 이를 해제하거나 종료해야합니다.
이 함수는 매우 빠르게 완료되고, 이 함수가 완료되면 Activity가 재개됨 상태에 들아갑니다(onResume()
호출).
상태: ON_RESUME
이 함수가 시작되면 Activity가 사용자와 상호작용합니다.
어떤 이벤트(전화가 옴, 사용자가 다른 Activity로 이동함, 기기 화면이 꺼짐 등)가 발생하여 앱에서 포커스가 떠날 때까지 이 상태에 머무릅니다.
ON_RESUME
이후에 초기화한 것이 있을 경우 ON_PAUSE
이후에 이를 해체해야합니다.
방해되는 이벤트가 발생하면 ON_PAUSE
상태로 변경됩니다(onPause()
호출).
ON_PAUSE
상태에서 다시 ON_RESUME
상태로 돌아올 때 onResume()
함수가 실행됩니다.
상태: ON_PAUSE
사용자가 Activity를 떠나는 것에대한 첫번째 신호입니다. ON_PAUSE
상태는 Activity가 포그라운드에 있지 않음을 표시합니다(다만, 멀티 윈도우 모드에서는 계속 표시될 수 있음). 이 상태에서는 사용자가 Activity와 상호작용하지 않습니다.
이 상태가 되면 배터리 수명등에 영향을 줄 수있는 리소스들을 해제할 수 있습니다. 하지만 onPause()에는 멀티윈도우등 여전히 화면에 표시될 수 있는 상황이 있기 때문에 완전히 해제할 때는 onStop()에서 하는 것이 좋습니다.
onPause()
는 아주 잠깐 실행됩니다. 따라서 저장 작업을 실행하기에는 시간이 부족할 수 있습니다. 따라서 다음 작업들은 onPause()에서 실행하면 안됩니다.
위와같이 부하가 큰 종료작업은 onStop()
일 때 하는 것이 좋습니다.
상태: ON_STOP
Activity가 더 이상 표시되지 않는 상태입니다. Activity가 화면에서 보이지않는 상태는 다음과 경우들이 있을 수 있습니다.
이 경우 시스템은 onStop()
콜백을 호출합니다.
이 상태에서는 앱이 사용자에게 보이지 않는 동안 필요하지 않은 리소스를 해제하거나 조정해야합니다.
ON_RESUME
에서 설명했던 부하가 큰 종료작업들을 onStop()에서 해야합니다.
사용자가 Activity로 다시 돌아오면 onRestart()
가 호출됩니다.
Activity가 실행을 종료하면 onDestroy()
를 호출합니다.
상태: ON_DESTROY
Activity가 소멸되기 전에 호출됩니다. Activity가 소멸되는 경우는 다음과 같습니다.
finish()
가 호출되거나 사용자가 Activity를 완전히 닫았을 때)onDestroy()에서는 onStop()에서 마저 해제하지 못한 리소스들을 해제해야합니다.
생명주기에 따라 무언가를 초기화하고 해제하는등의 작업을 할 때는 콜백함수안에서 실행하는 것보다 LifecycleObserver를 통해 작업하는 것을 권장합니다.
A Activity가 B Activity를 시작하였을 때 발생하는 작업 순서는 아래와 같습니다.
onPause()
메서드가 실행됩니다.onCreate()
,onStart()
,onResume
메서드가 순차적으로 실행됩니다.(포커스는 B Activity에 있습니다.)onStop()
메서드가 실행됩니다.이렇게해서 Activity의 생명주기에 대해 알아보았습니다. 다음글에서는 Fragment의 생명주기에 대해 알아보도록 하겠습니다.