Activity의 LifeCycle 알아보기
오늘은 저번 글에서 알아본 Android 4대 컴포넌트 중 Activity대해 알아보려 합니다. 이번 글에서는 액티비티의 LifeCycle에 대해 다뤄보도록 하겠습니다!
1. Activity LifeCycle이란?
사람은 태어나고, 성장하고, 늙고, 죽기까지 하나의 생명 주기를 가지고 있습니다, Activity도 이와 마찬가지로 생성부터 소멸까지 하나의 생명주기가 존재합니다.
Activity가 생성되고 소멸하기까지 그 중간에서 많은 이벤트들이 일어납니다. 전화가 걸려와서 Activity가 가려진다거나, 화면이 회전하거나, 핸드폰이 꺼져버리거나 등의 상황에 따라 Activity는 상태가 변하게 됩니다.
이러한 상태 변화를 감지할 수 있도록 Android에서는 Activity 상태에 따라 콜백을 호출하여 개발자들이 이를 알아차릴 수 있도록 하죠, 그렇다면 왜 이런 기능이 만들어지게 되었을까요?
만약 여러분이 문서 앱으로 열심히 과제를 하고 있다고 가정해 보겠습니다. 이때 갑자기 친구한테 전화가 오게 된다면? 과제를 하고 있던 문서 화면에서 나가지게 되겠죠. 통화를 끝나고 다시 그 화면으로 돌아왔을 때 지금까지 해놨던 작업물이 다 없어지게 된다면,, 상당히 골치가 아플 겁니다.
이러한 문제들에 유연하게 대응하기 위해서 Android에서 콜백을 통해 현재 LifeCycle상태를 알 수 있도록 하는 것이죠, 위 예시를 해결할 수 있는 방안으로는 화면이 가려지는 시점에서 데이터 저장 로직을 호출하여 화면으로 다시 돌아왔을 때 데이터를 표시해 줄 수 있도록 하여 해결할 수 있겠네요.
따라서 Android의 LifeCycle을 잘 이해하고 콜백메서드들을 적절한 상황에 활용하는 것은 Android개발자로서 기본적으로 갖추어햐 할 역량입니다!
2. LifeCycle CallBack Method
지금부터 어떤 콜백 메서드들이 있는지 알아보고, 각 메서드는 어떤 상황에 호출되는지 알아보겠습니다.
위 그림은 Activity의 LifeCycle을 그림으로 표현한 것입니다. Activity의 LifeCycle은 onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()의 6가지 핵심 콜백으로 이루어져 있습니다.
2-1. onCreate()
Activity가 CREATE상태가 되면 시스템에서 onCreate() 콜백을 호출합니다. 이 콜백은 Activity가 생성될 때 호출되는 콜백으로 필수적으로 구현해야 하는 콜백입니다.
이 콜백은 Activity 생성시점에만 딱 한번 호출되기 때문에 여러 초기화 작업을 진행하거나 Activity와 뷰모델 연결, View세팅등의 초기 설정작업을 진행하기 적합합니다.
또한 이 콜백은 savedInstanceState라는 Bundle타입의 파라미터를 받습니다. 이는 이전 Activity의 상태를 담고 있는 객체로 이를 통해 전 UI상태를 복원할 수 있습니다. (초기 액티비티의 경우 null값이 내려옴)
lateinit var textView: TextView
var gameState: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// savedInstanceState를 활용해 UI 상태 복원
gameState = savedInstanceState?.getString(GAME_STATE_KEY)
// View세팅
setContentView(R.layout.main_activity)
// textView 초기화
textView = findViewById(R.id.text_view)
}
공식문서에서 제공하는 onCreate의 예제 중 일부
2-2. onStart()
CREATE이후 Activity가 STARTED상태가 되면, 시스템에서 onStart() 콜백을 호출합니다. 이 콜백은 Activity가 사용자와 상호작용 하기 전, 즉 포그라운드상에 띄워지기 전 준비단계에 호출되는 콜백입니다.
onStart() 콜백은 빠르게 완료되고, Activity가 RUSUMED상태로 변함과 동시에 onResume() 콜백이 호출됩니다.
2-3. onResume()
Activity가 RESUMED상태가 되면 onResume() 콜백이 호출됩니다. 이 콜백은 Activity가 포그라운드에서 사용자와 상호작용할 때 호출되는 콜백입니다. 어떠한 이벤트가 발생하여 Activity가 포커스를 잃어버리기 전까지 RESUMED상태를 유지합니다.
만약 방해가 되는 이벤트가 발생하여 Activity가 포커스를 잃어버린다면, Activity는 PAUSED상태가 되고 시스템은 onPause() 콜백을 호출합니다. 방해 이벤트가 끝나 Activity가 포커스를 되찾는다면, 다시 RESUMED상태가 되고 onResume() 콜백이 호출됩니다.
따라서 이 콜백에서는 화면이 켜질 때마다 실행되어야 하는 초기화 작업을 하기 적합합니다.
2-4. onPause()
Activity가 PAUSED상태가 되면 onPause() 콜백이 호출됩니다. 이 콜백은 Activity가 포커스를 잃어버렸을 때 호출됩니다.
onPause() 콜백이 호출되는 경우는 다음과 같습니다.
- 방해 이벤트가 발생하는 경우 (ex: 갑자기 전화가 오는 경우)
- 멀티 윈도우 환경에서 다른 액티비티로 포커스가 이동하는 경우
- 반투명 Activity가 열리는 경우 (ex: 다이얼로그)
멀티 윈도우 환경이란?: 여러 앱이 동시에 띄워져 있는 상태를 의미한다.
onPause() 상태에서도 UI와 관련된 여러 작업들을 중지하여 리소스를 확보할 수 있습니다. 하지만 그렇게 된다면 멀티 윈도우 환경에서 포커스를 잃어버렸을 때 UI가 멈춘 것처럼 보일 수 있기 때문에 공식문서에서는 리소스 확보 작업을 onStop() 콜백에서 할 것을 권장하고 있습니다.
2-5. onStop()
Activity가 STOPPED 상태가 되면 onStop() 콜백이 호출됩니다. 이 콜백은 Activity가 사용자에게 더 이상 보이지 않게 될 때 호출됩니다. (새로운 Activity가 화면 전체를 차지할 때, Activity의 실행이 완료되어 종료될 때)
이 콜백에서는 위에서 설명했던 것처럼 사용자에게 필요 없는 작업을 중지하여 리소스를 확보할 수 있습니다. 이렇게 되면 멀티 윈도우 환경에서도 onPause()가 호출되더라도 UI관련 작업이 계속 진행됩니다.
추가로 만약 시스템에서 메모리를 확보해야 하는 경우, STOPPED상태의 Activity를 소멸시킬 수 있습니다. 하지만 이러한 경우 Bundle에 UI관련 상태를 저장해 놓고 Activity가 다시 시작되면 이를 기반으로 UI를 복원합니다.
2-6. onDestroy()
이 onDestroy() 콜백은 Activity가 완전히 소멸되기 전에 호출되는 콜백입니다. 시스템은 아래의 2가지 이유 중 하나일 때 해당 콜백을 호출합니다.
- 사용자가 Activity를 완전히 닫았거나, finish() 메서드가 호출된 경우
- 기기 회전 또는 멀티 윈도우 모드 전환과 같은 Configuration Change로 인해 시스템이 일시적으로 Activity를 소멸시키는 경우
만약 2번 케이스로 인해 onDestroy()가 호출된다면 시스템에서 즉시 새 Activity인스턴스를 만들게 됩니다.
마무리
오늘은 Android의 기본지식인 Activity의 LifeCycle에 대해 알아보았습니다.
오늘도 글 읽어주셔서 감사합니다, 글에 대한 피드백은 언제나 환영입니다!
'Android' 카테고리의 다른 글
[Android/Basic] Px, Dp, Sp에 대해 알아보기 (0) | 2024.10.14 |
---|---|
[Android/Basic] 3. Activity의 State Changes 알아보기 (0) | 2024.08.21 |
[Android/Basic] 1. Android 4대 컴포넌트 알아보기 (1) | 2024.07.22 |
[Android/Thread] 2. Thread간의 통신과정 알아보기 (1) | 2024.06.05 |
[Android/Thread] 1. Android의 Thread환경 (0) | 2024.05.16 |