개발/Rising Camp Android 4th

[2주차] 안드로이드 Frament 생명주기

Eun 2022. 2. 18. 14:46

Activity에 이어서 Frament까지 생명주기가 존재한다. 

따라서 Fragment의 Lifecycle에 대해서도 알아보도록 하자.

 

Fragment 란?

프래그먼트(Fragment)란 하나의 액티비티가 여러 개의 화면을 가지도록 만들기위해 고안된 개념이다. 

여러 개의 레이아웃을 보여주기 위해 액티비티를 사용할 수 있는데, 액티비티의 경우 생명주기 관계나 여러 구조적인 문제들때문에 프래그먼트라는 개념이 나오게 되었다.

Fragment를 사용하는 이유

  • 액티비티는 프래그먼트보다 비교시 상대적으로 무겁다. 하지만 Fragment는 단독으로 존재할 수 없기에 Activity의 존재는 필수적이다.
  •  
  • 액티비티에 비해 가볍게 추가/제거가 가능하다.
  • 액티비티 스택에 액티비티를 쌓아두기보다 프래그먼트백스택에서 프래그먼트를 관리하는게 메모리 관리에서의 효율도 챙기고 화면 전환시 액티비티보다 더 순조롭다.

Fragment Lifecycle

프래그먼트의 생명주기는 다음과 같다.

https://developer.android.com/guide/fragments/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을 안전하게 수행할 수 있는 마지막 지점이 되었다.

https://readystory.tistory.com/199

 

  • 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