프래그먼트의 생명주기에 대해 알아보겠습니다.
위에 그림에서 볼 수 있듯이 아래의 순서대로 진행됩니다.
자, 이 친구들을 하나하나씩 살펴보려고 하는데, 문서를 부면 최소한 다음과 같은 수명 주기 메서드를 구현해야 한다고 합니다.
onCreate()
프래그먼트를 생성할 때, 시스템에서 호출됩니다.
프래그러먼트가 일시정지되거나, 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화합니다.
주의해야 할 점은, onCreate()전에 onAttach()가 실행됩니다.
이 시점에서 Fragment View가 생성되지 않아서 Fragment의 View작업을 하기 적절하지 않습니다.
onCreateView()
프래그먼트에서 UI를 그릴 때 호출됩니다.
View를 반환해주는데 프래그먼트에서 UI를 제공하지 않으면 null을 반환합니다.
onPause()
시스템이 사용자가 프래그먼트를 떠나는 것을 감지하는 것입니다.
(사용자가 Fragment를 떠나기 시작했지만, 여전히 visible일 때 호출됩니다.)
현재 사용자 세션을 넘어서 지속되어야 하는 변경사항을 커밋합니다(사용자가 돌아오지 않을 수도 있으니깐요)
그러면 필수적이지 않은 나머지들은 어떤 것들이 있을까요?
onAttach()
이름처럼 액티비티에 프래그먼트가 attach할 때 호출됩니다.
onViewCreated()
onCreateView()를 통해 반환된 View는, onViewCreated()의 파라미터로 전달되는데, 이 시점부터 Fragment View의 라이프사이클이 INITIALIZED 되었기 때문에, View의 초기값 설정이나, LiveData overving or RecyclerView의 Adapter 세팅들을 onViewCreated에서 해주면 좋습니다.
onStart()
이제 Fragment가 사용자에게 보여질 수 있을 때 호출됩니다. Activity의 onStart()와 유사합니다.
onResume()
Fragment의 모든 애니메이션과 Transition 효과가 종료되고, 프래그먼트가 사용자와 상호작용이 가능할 때, onResume()이 호출됩니다.
이제 사용자와 프래그먼트가 상호작용할 준비가 되었다는 뜻인데, 반대로 말하면 onResume()이 실행되기 전에 사용자와 인터렉션 하는 것은 부적절합니다.
onStop(), onSaveInstanceState()
프래그먼트가 화면에 보이지 않을 때가 되면 onStop()이 호출됩니다.
API28 버전을 전후로
전 : onSaveInstanceState() -> onStop()
후 : onStop() -> onSaveInstanceState()
이 순서로 실행됩니다.
onDestroyView()
Fragment가 화면으로 벗어나면 onDestroyView()가 실행됩니다.
해당 시점부터는 Fragment View에 대한 모든 참조가 제거되야 합니다.
onDestroy()
Fragment가 제거되면 호출됩니다. 자 얘네들이 어떻게 호출되는지 살펴봅니다.
우선 제가 액티비티에 프래그먼트가 2개 있는 예제를 만들어봤습니다.
MainAcitivty, LifeFragment, Life2Fragment 라고 만들어봤습니다.
메인액티비티와 프래그먼트를 이런식으로 로그를 찍어봤습니다.
자 처음에 앱을 켜면 어떻게 되는지 보겠습니다.
여기에서 LifeFragment2로 움직이면 기존의 LifeFramgnet가 onPause, onStop, onDestoryView가 호출됩니다.
그러면 LifeFragment2가 어떻게 되냐 하면 아래와 같이 나옵니다.
여기에서 앱을 뒤로 빼면 어떻게 되냐 하면 아래와 같이 나옵니다.
자, 여기에서 앱을 강제종료하면 아래와 같이 나옵니다.
아래의 블로그를 많이 참고했습니다.
- 참고
https://readystory.tistory.com/199
'Android(Kotlin)' 카테고리의 다른 글
Execution failed for task ':app:kaptDebugKotlin' (0) | 2021.08.21 |
---|---|
간단한 Android Network 연결 상태 체크 (0) | 2021.08.20 |
LiveData ViewModel (0) | 2021.08.18 |
Android ViewModel (0) | 2021.08.18 |
데이터바인딩(databinding) 양방향 binding (0) | 2021.08.18 |