티스토리 뷰
Activity의 LifeCycle
- 안드로이드 앱은 여러개의 액티비티가 연결되어있는 구조라고 볼 수 있고, 각 액티비티는 생명주기에 따라 관리된다
- 액티비티의 클래스는 다음과 같이 6개의 콜백 함수를 제공한다
✔️ onCreate()
- 어플리케이션 최초 실행 시 가장 처음으로 한 번 실행되는 함수
- 해당 Activity의 생명주기 중 딱 한번만 실행되며 viewModel연결과 인스턴스 생성 등 초기화 작업을 이 안에서 실행하면 된다
- onCreate() 메소드를 실행 완료하면 Activity는 시작됨 상태에 진입한다
- onCreate 함수에 항상 매개변수로 있는 savedInstanceState는 이전 Activity의 상태를 가지고 있는 Bundle객체이다
- ex) 세로에서 가로로 화면회전시, onDestroy()가 실행되기 직전 onSaveInstanceState()에서 Bundle 객체 저장 후 onCreate()를 실행하기 때문에 화면회전 후에도 데이터가 그대로 유지된다
✔️ onStart()
- Activity가 시작됨 상태에 진입하면 Activity가 화면에 보이기 직전 빠르게 onStart()가 실행된다
- 이 단계에서 앱은 Activity를 foreground로 보내 사용자와 상호작용할 수 있도록 준비한다
- onStart() 메소드를 실행 완료하면 Activity가 재개됨 상태로 진입한다
✔️ onResume()
- onStart()실행 후 바로 onResume()이 호출되며 이 상태에 들어가면 사용자가 앱과 상호작용을 할 수 있다
- 전화가 오거나 홈버튼을 누르거나 다른 Activity로 이동하는 등의 이벤트가 발생해 포커스를 잃기 전까지 이 상태에 머문다
✔️ onRestart()
- Activity가 중단됨 상태에서 다시 호출되었을 때 실행된다
- onRestart() 뒤에는 항상 onStart()가 실행된다
✔️ onPause()
- onResume()상태에서 이벤트가 발생해 포커스를 잃게되면 Activity는 일시정지 상태가 되며 onPause()를 호출한다
- Activity가 완전히 가려지지않고, 일부분이 보이거나 투명 Activity가 실행되었을 시에는 onPause()까지만 실행이 된다
- onPause()상태를 유지하다가 Activity가 다시 포커스를 얻게되면 onResume() 콜백을 실행한다
- 다른 Activity 실행 전에 실행되기 때문에 onPause()에서 너무 많은 작업을 하게되면 다음 Activity가 실행이 지연되게 된다
✔️ onStop()
- Activity가 중단됨 상태에 진입하면 onPause()에 이어 onStop()까지 호출하게 된다
- 홈버튼을 누르거나 새로운 Activity가 실행되어 해당 Activity가 완전히 보이지 않게되는 경우에 해당한다
- 이 상태에서 Activity를 다시 시작하면 onRestart()를, Activity 실행을 종료하면 onDestroy()를 실행한다
- 예를들어, 홈버튼을 누른 상태에서 다시 앱을 실행하면 onRestart()에 이어 onStart()까지 실행되고, 뒤로가기를 눌러 앱을 종료하면 onPause() , onStop()에 이어 onDestroy()까지 호출한다
✔️ onDestroy()
- Activity에서 finish를 실행 해 Activity가 종료되어 스택에서 사라질 때 호출된다
Fagment의 LifeCycle
- Fragment는 Activity에 소속되는 것이므로 Activity와 연관된 생명주기를 가진다
✔️ onAttach()
- Fragment가 Activity와 연결될 때 호출된다
- 아직 Fragment가 완벽하게 생성된 상태는 아니다
✔️ onCreate()
- Activity에서 Fragment를 호출하여 생성될 때 호출된다
- Activity의 onCreate()와 마찬가지로 초기화작업을 여기서 실행하면 된다
- Fragment를 생성하며 Activity에서 넘겨준 값이 있다면 여기서 변수에 넣어주면 된다
- 다만, Activity와는 달리 Fragment의 onCreate()에서는 view와 관련된 UI작업을 할 수 없다
✔️ onCreateView()
- Fragment에서 UI를 그릴 때 호출되는 콜백이다
- Layout을 inflate해서 반환해주고, view 객체를 얻을 수 있으므로 UI와 관련된 바인딩 작업을 실행하면 된다
- onCreateView의 매개변수로 전달되는 container가 Activity의 ViewGroup이며, 여기에 Fragment가 위치하게 된다
- 또 다른 매개변수인 savedInstanceState는 Bundle 객체로 Fragment가 재개되는 경우 이전 상태에 대한 데이터를 제공한다
✔️ onActivityCreated()
- Activity에서 onCreate() 실행이 끝난 후 호출된다
- Activity와 Fragment의 뷰가 모두 생성되고, 연결된 상태이고, view의 변경 작업이 가능하다
✔️ onStart()
- Activity와 같이 Fragment가 화면에 보여지기 직전 빠르게 실행된다
- 여기서 Activity는 시작됨 상태이다
✔️ onResume()
- Fagment가 화면에 보여지며 사용자와 상호작용이 가능한 시점이다
- Activity와 마찬가지로 이벤트가 발생하여 Fragment가 가려지기 전까지 이 상태가 유지된다
✔️ onPause()
- 부모 Activity가 아닌 다른 Activity가 위로 올라오거나, 다른 Fragment가 add되는 경우 일시정지 상태로 들어간다
- UI관련 처리를 정지하고, 중요한 데이터를 저장한다
✔️ onStop()
- Fragment가 완전히 가려지는 경우 onPause()에 이어 onStop()까지 실행된다
- 시스템에서 onStateInstance()를 호출하여 UI의 상태를 저장하므로 Activity를 다시 띄우면 이전 상태가 그대로 보여진다
✔️ onDestroyView()
- Fragment와 관련된 view가 제거될 때 실행된다
- Activity에서 Fragment 생성 시 addToBackStack()를 요청했을 경우 onDestroy()를 호출하지 않고 인스턴스가 저장되어 있다가 Fragment를 다시 부를 때 onCreateView()를 실행하여 다시 화면에 보여지게 한다
✔️ onDestroy()
- view가 제거된 후 Fragment가 완전히 소멸되기 전에 호출된다
✔️ onDetach()
- Fragment가 완전히 소멸되고, Activity와의 연결도 끊어질 때 실행된다
🕊 참고자료
Activity 수명 주기에 대한 이해 | Android 개발자 | Android Developers
An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface��
developer.android.com
프래그먼트 | Android 개발자 | Android Developers
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section��
developer.android.com
Fragment addToBackStack
addToBackStack을 사용하게 되면 화면을 Stack에 저장합니다. Back버튼을 눌렀을 때 스택에 저장된 프래그먼트가 사라지게 됩니다. 기본 메인화면에서 addToBackStack을 이용해 화면을 저장하고 또 되��
jhpop.tistory.com
'Android' 카테고리의 다른 글
[Android & Kotlin] Intent로 Data Class 타입 객체 넘기기 (1) | 2020.08.21 |
---|---|
[Android] 안드로이드 스레드 (Android Thread) (0) | 2020.06.24 |
[Android] 어플리케이션 기본 항목 - 4대 컴포넌트, App Manifest (0) | 2020.06.23 |
[Android & kotlin] AAC(Android Architecture Components) - Room (0) | 2020.06.22 |
[kotlin] DI 의존성 주입 - koin 사용하기 (0) | 2020.06.14 |