본문 바로가기

Android

[Android] Fragment 생명주기

1. Fragment 란

 

 Fragment는 동작 또는 Activity내에서 UI의 일부를 나타낸다. 여러 개의 프래그먼트를 하나의 액티비티에 조합해 창이 여러 개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있다. 프래그먼트는 자체 수명 주기를 가지고, 자체 입력 이벤트를 받으며, 액티비티 실행 중에 추가 및 제거가 가능한 액티비티의 모듈 섹션이라고 생각하면 된다.

 

 프래그먼트는 항상 액티비티 내에 포함되어 있어야 하며 해당 프래그먼트의 수명주기는 호스트 액티비티의 수명주기에 직접적으로 영향을 받는다.

 

 이러한 프래그먼트는 분할된 화면들을 독립적으로 구성하기 위해 사용하고, 분할된 화면들의 상태를 관리하기 위해 사용한다.

 

 

2. Fragment's Lifecycle & Fragment's View's Lifecycle

 

 안드로이드에서는 생명주기에 맞추어 개발하는 것이 매우 중요하다. Fragment의 생명주기는 레이아웃에 추가하거나 변경할 때 시작한다. 아래 그림은 FragmentTransaction의 add함수를 통해 onAttach()를 시작으로 onDetach() 까지의 과정이다. Fragment 생명주기는 크게 시작하는 과정 (onAttach() ~ onResume()) 과 종료 과정(onPause() ~ onDetach()) 으로 나누어진다. Fragment 가 백스택에 최상단으로 올라왔을 경우에는 생명주기가 CREATED - STARTED - RESUMED 순으로 진행되고, 반대로 백스택에서 pop 됐을 경우에는 RESUMED - STARTED - CREATED - DESTROYED 순으로 진행된다.

 

 

 

 

 그림을 보면 Fragment Lifecycle 과 View Lifecycle 이 상이한 것을 볼 수 있다. Fragment 의 Lifecycle 이 변화되는 순간 Fragment Callback 함수를 호출하게 되고, 해당 콜백 함수가 종료되는 시점에 View 의 Lifecycle 에 이벤트를 전달하게 된다.

 

각 과정에 대해 자세히 살펴보자.

 

1) onAttach()

Fragment가 Activity에 attach 될 때 호출된다. onCreate() 이전에 onAttach() 가 먼저 호출된다 것을 유의하자. 

 

 

2) onCreate()

  Activity와 마찬가지로 초기화해야하는 리소스들을 여기서 초기화한다. 프래그먼트를 생성하면서 넘겨준 값들이 있다면, 여기서 변수에 넣어주면 된다. 하지만 여기서는 ui초기화는 할 수 없는데 그 이유는 이 시점에는 아직 Fragment View 가 생성되지 않았기 때문에 Fragment 의 View 와 관련된 작업을 할 수 없기 때문이다.

 

 또 onCreate() 콜백 시점에는 Bundle 타입으로 savedInstanceState 파라미터가 함께 제공되는데, 이는 onSaveInstanceState() 콜백 함수에 의에 저장된 Bundle 값이다. 여기서 또 알아야할 부분은 savedInstanceState 파라미터는 프래그먼트가 처음 생성 됐을 때만 null 로 넘어오며, onSaveInstanceState() 함수를 재정의하지 않았더라도 그 이후 재생성부터는 non-null 값으로 넘어온다.

 

 

3) onCreateView(), onViewCreated()

 onCreate() 이후에는 onCreateView() 와 onViewCreated() 콜백함수가 이어서 호출된다. onCreateView() 의 반환값으로 정상적인 Fragment View 객체를 제공했을 때만 Fragment View 의 Lifecycle 이 생성된다.

 

 onCreateView() 를 재정의 하여 Fragment View 를 직접 생성하고 inflate 할 수 있지만, LayoutId 를 받는 Fragment 의 생성자를 사용하여 해당 리소스 아이디 값을 통해 onCreateView() 재정의 없이도 Fragment View 를 생성할 수도 있다.

 

 onCreateView() 를 통해 반환된 View 객체는 onViewCreated() 의 파라미터로 전달되는데, 이 시점부터는 Fragment View 의 Lifecycle 이 INITIALIZED 상태로 업데이트 됐기 때문에 View 의 초기값을 설정해주거나 LiveData 옵저빙, RecyclerView 또는 ViewPager2 에 사용될 Adapter 세팅 등은 onViewCreated() 에서 해주는 것이 적절하다.

 

4) onViewStateRestored()

onViewStateRestored() 함수는 저장해둔 모든 state 값이 Fragment 의 View 계층구조에 복원 됐을 때 호출됩니다. 따라서 여기서부터는 체크박스 위젯이 현재 체크 되어있는지 등 각 뷰의 상태값을 체크할 수 있다.

 

 

5) onActivityCreated()

onCreateView를 마치고 Activity에서 onCreate()가 호출되고 나서 호출되는 메소드이다. Activity와 Fragment뷰가 모두 생성된 상태로, View를 변경하는 작업이 가능한 단계다.

 

 

6) onStart()

Activity에서의 역할과 비슷하게 user에게 Fragment가 보이도록 해준다. Activity는 이 단계에서는 started 상태이다.

Fragment 가 사용자에게 보여질 수 있을 때 호출됩니다. 이는 주로 Fragment 가 attach 되어있는 Activity 의 onStart() 시점과 유사합니다. 이 시점부터는 Fragment 의 child FragmentManager 통해 FragmentTransaction 을 안전하게 수행할 수 있다.

 

7) onResume()

Activity에서의 역할과 비슷하게 user에게 Fragment가 보여지고, user와 상호작용이 가능하게 되는 부분이다.

 

 

7) onPause()

사용자가 Fragment 를 떠나기 시작했지만 Fragment 는 여전히 visible 일 때 onPause() 가 호출된다.

이 때 유의할 점은 Fragment 와 View 의 Lifecycle 이 PAUSED 가 아닌 STARTED 가 된다는 점이다.

 

 

8) onStop()

Fragment 가 더이상 화면에 보여지지 않게 되면 Fragment 와 View 의 Lifecycle 은 CREATED 상태가 되고, onStop() 콜백 함수가 호출되게 된다. 이 상태는 부모 액티비티나 프래그먼트가 중단됐을 때 뿐만 아니라, 부모 액티비티나 프래그먼트의 상태가 저장될 때도 호출된다.

 

 Fragment 의 onStop() 의 경우 주의해야할 점이 있는데, API 28 버전을 기점으로 onSaveInstanceState() 함수와 onStop() 함수 호출 순서가 달라졌다.  API 28 버전부터 onStop() 이 onSaveInstanceState() 함수보다 먼저 호출됨으로써 onStop() 이 FragmentTransaction 을 안전하게 수행할 수 있는 마지막 지점이 되었다.

 

9) onDestroyView()

Fragment와 관련된 View가 제거되는 단계이다. 모든 exit animation 과 transition 이 완료되고, Fragment 가 화면으로부터 벗어났을 경우 Fragment View 의 Lifecycle 은 DESTROYED 가 되고 onDestroy() 가 호출된다. 이 시점부터는 getViewLifecycleOwnerLiveData() 의 리턴값으로 null 이 반환된다. 그리고 해당 시점에서는 가비지 컬렉터에 의해 수거될 수 있도록 Fragment View 에 대한 모든 참조가 제거되어야 한다.

 

10) onDestroy()

프래그먼트가 생성될 때는 onCreate -> onCreateView로 초기화할 리소스들과 초기화할 뷰를 순서대로 호출했으나,

Destroy할 때는 반대로 onDestroy -> onDestroyCiew에서 View를 제거하고, onDestroy를 호출한다.

 

 Fragment 가 제거되거나 FragmentManager 가 destroy 됐을 경우, 프래그먼트의 Lifecycle 은 DESTROYED 상태가 되고, onDestroy() 콜백 함수가 호출됩니다. 해당 지점은 Fragment Lifecycle 의 끝을 알린다. 그리고 onAttach() 가 onCreate() 이전에 호출 됐던 것처럼 onDetach() 또한 onDestroy() 이후에 호출된다.

 

11) onDetach()

프래그먼트가 액티비티로부터 해제되어질 때 호출한다.

'Android' 카테고리의 다른 글

[Android] Multi-ViewType RecyclerView  (1) 2023.08.09
[Android] RecyclerView  (1) 2023.08.03
[Android] Activity 생명주기와 상태  (0) 2023.04.07
[Android] LinearLayout  (0) 2022.12.02
[Android] Layout 개요  (0) 2022.11.21