[안드로이드] Fragment 생명주기

이상욱·2022년 12월 21일
0

안드로이드

목록 보기
5/17

Frgment 생명주기

각 Fragment인스턴스에는 자체 수명 주기가 있습니다. 사용자가 앱을 탐색하고 상호 작용할 때 프래그먼트는 추가, 제거 및 화면에 들어가거나 나올 때 수명 주기의 다양한 상태로 전환됩니다.

디벨로퍼 문서에서는 아래와 같이 lifecycle상태 및 프래그먼트의 수명주기 콜백과 뷰 lifecycle 관계를 나타내고 있습니다

1. onCreate()

Fragment 만 CREATED가 된 상황입니다. FragmentManager 에 add 됐을 때 도달하며 onCreate() 콜백함수를 호출합니다. onCreate() 이전에 onAttach() 가 먼저 호출됩니다.

✅주의할 점은 이 시점에는 아직 Fragment View 가 생성되지 않았기 때문에 Fragment 의 View 와 관련된 작업을 두기에 적절하지 않습니다.

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

2. onCreateView()

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

3. onViewCreated()

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

4. onStart

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

5. onResume

Fragment가 보이는 상태에서 모든 Animator 와 Transition 효과가 종료되고, 프래그먼트가 사용자와 상호작용할 수 있을 때 onResume() 콜백이 호출됩니다. onStart()와 마찬가지로 주로 Activity 의 onResume() 시점과 유사합니다.

onResume()이 호출되지 않은 시점에서는 입력을 시도하거나 포커스를 설정하는 등의 작업을 임의로 하면 안됩니다.

6. onPause

사용자가 Fragment를 떠나기 시작했지만 Fragment는 여전히 visible 일 때 onPause()가 호출됩니다.
Fragment 와 View의 Lifecycle이 PAUSED가 아닌 STARTED가 됩니다.

엄밀히 따지면 Lifecycle 에 PAUSE 와 STOP 에 해당하는 상태가 없습니다.

7. onStop

Fragment 가 더이상 화면에 보여지지 않게 되면 Fragment 와 View 의 Lifecycle 은 CREATED 상태가 되고, onStop() 콜백 함수가 호출되게 됩니다. 이 상태는 부모 액티비티나 프래그먼트가 중단됐을 때 뿐만 아니라, 부모 액티비티나 프래그먼트의 상태가 저장될 때도 호출됩니다.
API 28 버전을 기점으로 onSaveInstanceState() 함수와 onStop() 함수 호출 순서가 달라졌습니다. onStop() 이 FragmentTransaction 을 안전하게 수행할 수 있는 마지막 지점이 되었습니다.

8. onDestroyView

모든 exit animation 과 transition 이 완료되고, Fragment 가 화면으로부터 벗어났을 경우 Fragment View의 Lifecycl 은 DESTROYED가 되고 onDestroy()가 호출됩니다.

이 시점부터는 getViewLifecycleOwnerLiveData()의 리턴값으로 null이 반환됩니다.

그리고 해당 시점에서는 가비지 컬렉터에 의해 수거될 수 있도록 Fragment View에 대한 모든 참조가 제거되어야 합니다.

9. onDetroy

Fragment가 제거되거나 FragmentManager가 destroy 됐을 경우, 프래그먼트의 Lifecycle 은 DESTROYED 상태가 되고, onDestroy() 콜백 함수가 호출됩니다. 해당 지점은 Fragment Lifecycle 의 끝을 알립니다.

그리고 onAttach() 가 onCreate() 이전에 호출 됐던 것처럼 onDetach() 또한 onDestroy() 이후에 호출됩니다.

예제

MainActivity에서 -> SecondActivity로 이동 -> SecondActivity에 FragmentContainerView에FirstFragment 실행

이후에 FirstFragment에서 navigate를 통해 SecondFragment로 이동

profile
항상 배우고 성장하는 안드로이드 개발자

0개의 댓글