안드로이드 앱에서 화면 UI를 구성하는 고정된 화면이자 사용자의 진입점이 되어주는 Activity에는 생성과 소멸에 관한 Lifecycle이 존재한다.
Activity의 Lifecycle에 대한 이해는 사용자가 앱에서 어떤 행동을 취할 지 모르는 상황에서의 대비를 명확하게 하는 데에 큰 도움을 준다.
예를 들어, 사용자가 앱을 사용 중 전화를 받는다거나 다른 앱으로의 전환 등의 동작을 할 때 우리가 만든 소중한 앱은 어떤 상태로 바뀌는지 알아야 할 것이고, 앱이 백그라운드 상태에 있을 때 어떤 행동을 취해야 하는지를 정의하는 데에 있어 Lifecycle에 대한 이해는 필수적이다.
Activity와 Fragment는 비슷하지만 조금 다른 Lifecycle을 가지고 있다. 이번 글에서는 Activity의 Lifecycle에 대해 알아본다.
이와 더불어, Lifecycle에 대한 이해가 됐을 때 생각 해 볼 수 있는 다음 문제에 대해 알아본다.
[Activity에서 새로운 Activity를 시작 했을 때 두 Activity의 Lifecycle의 변화 순서는 어떻게 될까?]
(1) Activity의 Lifecycle
안드로이드 공식문서가 잘 되어 있으니 공식 문서의 표를 보자.
Activity의 Lifecycle은 기본적으로 onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy의 생성과 소멸 순서를 갖는다. 중간에 onRestart라는 친구가 껴있고 onPause에서 onStart로 돌아가는 flow가 있는데, 이는 아래에서 자세히 보기로 한다.
onCreate()
Activity가 생성 될 때 최초 1회, 가장 먼저 실행되는 함수이다.
onCreate 함수의 경우 전체 수명 주기 동안 딱 한 번만 실행되므로, 기본 애플리케이션의 최초 로직을 짤 때 본 함수에서 수행한다.
또는 화면 방향 전환 등으로 Destroy된 이전 Activity 상태에 대한 복원을 위해 savedInstanceState를 가져오는 작업을 수행한다.
ex) 데이터의 binding, ViewModel의 연결, 클래스의 인스턴스화
onStart()
onCreate() 함수가 실행된 후, onStart() 함수가 실행된다.
이 때에는 Activity가 사용자에게 표시되며, 앱에서는 Activity를 포그라운드로 보내 상호작용을 준비한다.
앱이 UI를 관리하는 코드를 본 함수에서 초기화한다.
ex) 리스너 등록
onResume()
onStart() 함수가 실행된 후, onResume() 함수가 실행된다.
이 때에는 앱과 사용자가 클릭 등의 상호작용이 가능한 시점이다. onCreate, onStart의 경우와 달리 사용자가 Home 버튼을 누르는 등 앱의 포커스가 사라지지 않는 한 계속 onResume 상태에 머무르게 된다.
이 때에는 앱이 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화 하게 된다.
ex) 카메라 미리보기 시작, 사용자에게 보여질 데이터 로드
onPause()
onResume 상태에서 사용자가 Activity를 떠날 때의 첫 번째 신호이다.
Activity가 사용자에게 보여지지 않을 때 호출된다. 앱 사용 도중 전화를 받거나, 다른 앱으로 이동 할 때가 그 예이다.
이 때에는 컴포넌트들이 사용자에게 보여지지 않을 때 사용 할 필요가 없는 기능들을 정지 할 수 있도록 한다.
또는 임시로 현재 앱에서 소멸 될 수 있는 값들을 저장 할 수 있도록 한다.
ex) 카메라 미리보기 정지, Shared Preferences를 통한 현재 값 임시 저장
onStop()
사용자가 Activity를 떠나 사용자에게 보여지지 않을 때 onPause 이후 호출되는 함수이다.
예를 들어, 새로 시작된 다른 동작이 사용자의 화면을 완전히 차지 했을 때 호출된다.
이 때에는 컴포넌트들이 사용자에게 보여지지 않을 때 사용 할 필요가 없는 기능들을 정지 할 수 있도록 한다.
ex) 카메라 미리보기 정지
* onPause와의 차이점 : onStop에서 기능을 정지 했을 때에는 멀티 윈도우 화면에서 기능이 정지하지 않고 수행된다.
또한, 데이터베이스에 정보를 쓰는 작업 or 규모가 크고 CPU를 많이 차지하는 종료 작업의 경우 onPause보다는 onStop 시점에서 작업 한다.
onRestart()
onStop() 상태에서 다시 사용자가 앱의 Activity로 돌아왔을 때 실행된다.
onRestart가 수행된 후, 다시 onStart() -> onResume() 순서를 진행하게 된다.
onDestroy()
lifecycle에서 해당 Activity가 완전히 소멸 됐을 때 실행된다.
예를 들어 finish()를 통해 Activity가 소멸 됐을 경우, 화면 전환으로 인해 시스템에서 일시적으로 Activity를 소멸시키는 경우이다.
onPause, onStop에서 해제하지 않은 모든 리소스를 해제하는 동작을 본 함수에서 수행하게 된다.
(2) Activity에서 새로운 Activity를 시작 했을 때 두 Activity의 Lifecycle의 변화 순서
A 액티비티에서 B 액티비티를 시작했을 때 A 액티비티와 B 액티비티의 lifecycle은 어떤 순서로 동작할까?
공식 문서를 통해 제대로 공부하기 전에는 당연히 아래 순서일 것이라고 생각했다.
A onPause()
A onStop()
B onCreate()
B onStart()
B onResume()
하지만 공식 문서에서는 이런 나를 예상하기라도 한듯 이렇게 써있었다.
요약하면, A 액티비티의 onPause 메서드 수행 후 B 액티비티가 onResume 상태에 들어가고 나서야 onStop 메서드가 실행된다는 것이다.
직접 프로젝트를 생성 해 Log를 띄워보았다.
MainActivity에서 SecondActivity를 시작했을 때 lifecycle이다.
정말 MainActivity의 onPause 메소드가 수행된 후, Second Activity의 onCreate -> onStart -> onResume까지 수행된 후에야 MainActivity의 onStop 메소드가 수행됐다. 놀라워라
기억하자. 새로운 액티비티가 시작되었을 때 순서는
A onPause()
B onCreate()
B onStart()
B onResume()
A onStop()
이다. 앞으로는 새로운 친구가 준비 될 때까지 기다려주고 떠나는 것으로 생각한다.
그렇다면 B 액티비티에서 뒤로가기 버튼을 눌러 B 액티비티를 소멸시키고 다시 A 액티비티로 돌아오면 어떻게 될까?
역시나 B 액티비티에서 onPause 메소드가 수행된 후, 다시 돌아온 A 액티비티가 준비 될 때까지 기다려주고 생을 마감한다.
눈물 겨운 Activity들의 Lifecycle 스토리를 통해 생명주기의 흐름을 다시 한 번 올바르게 익히고, 각 생명주기 별 메소드를 적재적소에 활용 할 수 있도록 노력하자. 홧팅!
출처 : https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ko
https://developer.android.com/reference/android/app/Activity
https://seongjaemoon.github.io/android/2017/12/04/androidActivity.html
'Android' 카테고리의 다른 글
[Android] View와 ViewGroup의 관계 (0) | 2021.11.16 |
---|---|
[Android, Kotlin] Broadcast Receiver에서의 비동기 백그라운드 작업 (0) | 2021.11.16 |
[Android, Kotlin] Gradle / build.gradle(project)와 build.gradle(module) 차이 (0) | 2021.11.12 |
[Android, Kotlin] Recycler View 안에 Recycler View 넣기, 중첩 RecyclerView (0) | 2021.11.11 |
[Android, Kotlin] 앱 내에서 위치 권한 받기 (Location Permission) (0) | 2021.11.11 |