[2주차] 안드로이드 Frament 생명주기
Activity에 이어서 Frament까지 생명주기가 존재한다.
따라서 Fragment의 Lifecycle에 대해서도 알아보도록 하자.
Fragment 란?
프래그먼트(Fragment)란 하나의 액티비티가 여러 개의 화면을 가지도록 만들기위해 고안된 개념이다.
여러 개의 레이아웃을 보여주기 위해 액티비티를 사용할 수 있는데, 액티비티의 경우 생명주기 관계나 여러 구조적인 문제들때문에 프래그먼트라는 개념이 나오게 되었다.
Fragment를 사용하는 이유
- 액티비티는 프래그먼트보다 비교시 상대적으로 무겁다. 하지만 Fragment는 단독으로 존재할 수 없기에 Activity의 존재는 필수적이다.
- 액티비티에 비해 가볍게 추가/제거가 가능하다.
- 액티비티 스택에 액티비티를 쌓아두기보다 프래그먼트백스택에서 프래그먼트를 관리하는게 메모리 관리에서의 효율도 챙기고 화면 전환시 액티비티보다 더 순조롭다.
Fragment Lifecycle
프래그먼트의 생명주기는 다음과 같다.
액티비티의 생명주기와는 다르게 조금(?) 복잡하다.
액티비티와 프래그먼트 마찬가지로 생명주기는 위에서 아래로 진행한다.
- onAttach()
액티비티에 프래그먼트가 처음으로 부착될 때 호출된다. 프래그먼트는 필수적으로 하나의 액티비티에 종속되어야한다. 이 때문에 시작단계에서 어떤 액티비티에 붙을 것인지 결정하게 되는 것이다.
- onCreate()
프래그먼트에 꼭 필요한 요소 등를 먼저 초기화하고 시작할 수 있다.
- onCreateView(), onViewCreated()
프래그먼트를 프로그래밍할 때 가장 많이 보고 쓰게 되는 콜백함수 중 하나이다. 이 함수에서 프래그먼트에 쓰일 view들을 정의하고 초기화하게 된다. 이때, 프래그먼트는 자신의 레이아웃을 루트 뷰로 설정하고 이를 inflate하게 된다.
onCreateView()를 통해 반환된 View객체는 onViewCreated()의 파라미터로 전달되는데, 이 시점부터는 view의 초기값을 설정해주거나 LiveData 옵저빙, RecyclerView 또는 ViewPager에 사용될 Adapter 세팅 등은 onViewCreated()에서 해주는 것이 적절하다.
- onViewStateRestored()
저장해둔 모든 state 값이 fragment의 view 계층구조에 복원 됐을 때 호출된다. 따라서 여기서부터는 체크박스 위젯이 현재 체크 되어있는지 등 각 뷰의 상태값을 체크할 수 있다.
- onStart()
프래그먼트가 사용자에게 보여질 수 있을 때 호출된다. 이는 주로 프래그먼트가 attach 되어있는 액티비티의 onStart()시점과 유사하다.
- onResume()
프래그먼트가 보이는 상태에서 모든 Animator와 transition 효과가 종료되고 프래그먼트가 사용자와 상호작용할 수 있을 때 이 콜백함수가 호출된다. 주로 Activity의 onResume() 시점과 유사하다.
- onPause()
프래그먼트가 정지되는 시점을 정의한다. 이 시점에서 남겨두어야 하거나 영구적으로 보존해야 할 자료들을 저장하게 된다.
- onStop()
프래그먼트가 더이상 화면에 보여지지 않게 되면 onStop() 콜백함수가 호출되게 된다. onStop()의 경우 주의할 점이 있는데, API28 기점으로 onSaveInstanceState() 함수와 onStop() 함수 호출 순서가 달라졌다.
아래 그림에서 볼 수 있듯이 onStop()이 먼저 실행됨으로써 FragmentTransaction을 안전하게 수행할 수 있는 마지막 지점이 되었다.
- onDestroyView()
프래그먼트가 화면으로부터 벗어났을 경우 onDestroy()가 호출된다.
해당 시점에서는 가비지 컬렉터에 의해 수거될 수 있또록 Fragment View에 대한 모든 참조가 제거되어야 한다.
- onDestory()
프래그먼트가 제거되거나 FragmentManager가 destroy 됐을 경우, onDestory() 콜백 함수가 호출된다.
해당 지점은 프래그먼트의 생명주기의 끝을 알린다.
onAttach()가 onCreate() 전에 호출됐던 것처럼 onDetach() 또한 onDestory()이후에 호출된다.
FirstFrgment가 add 되는 순서
onAttach - onCreate - onCreateView - onViewCreate - onViewStateRestored - onStart - onResume
FirstFragment와 SecondFragment의 호출순서
FragmentTransaction을 통해 프래그먼트가 서로 바뀔때 호출순서를 알아보자.
FirstFragment가 onPause - onStop 이 호출된 후에
SecondFragement가 onAttach - onCreate - onCreateView - onViewCreate - onViewStateRestore - onStart 가 호출되고
FirstFragment가 onDestoryView - onDestroy - onDetach가 되고 나서
SecondFragment가 onResume을 호출한다.
- 참고
안드로이드 - 프래그먼트(Fragment) 파헤치기
1.프래그먼트 (fragment) 란? 프래그먼트 (fragment) 는 하나의 액티비티가 여러 개의 화면을 가지도록 만들기위해 고안된 개념입니다. 다양한 크기의 화면을 가진 모바일 환경이 늘어남에 따라 하나
tedrepository.tistory.com
- 참고
[Android] 의외로 잘 모르는 Fragment 의 Lifecycle
많은 앱들이 여러가지 이유로 single activity application 을 지향하고 있습니다. 따라서 Fragment 로 UI 를 구성하는 경우가 굉장히 많은데요. 이때 많은 개발자들이 Activity 의 Lifecycle 에 대해서는 잘 알고
readystory.tistory.com