Tech Log

[Android] Fragment 생명 주기 본문

Android/etc

[Android] Fragment 생명 주기

yuhee kim 2022. 6. 25. 23:39

Fragment에 대해서 공부하면서, Fragment에도 생명주기가 있다는 것을 알게 되었다. Fragment는 Activity에 종속이 될 텐데 Fragment의 생명 주기는 종속되는 중에 어떻게 돌아갈까 궁금했다. 이번 포스팅에서는 Fragment 생명 주기에 대해서 자세히 알아보고자 한다. 그리고 Activity 생명 주기와는 어떤 다른 점이 있는지 공부해보고자 한다.

 

 

 

1.  배경

Fragment도 Activity와 마찬가지로 UI를 빌드하는 것이므로 Activity가 생명주기를 갖는 것과 같은 이유로 생명주기를 갖고 있다.

생명주기 콜백 함수가 있는 이유는 사용자가 Fragment 화면을 나가거나 돌아올 때 대응하기 위해서였다. 그 외에도 다른 이유들이 있는데 아래 링크에서 생명주기를 사용하는 이유를 참고할 수 있다.

 

Activity 생명주기 포스팅 참고

 

[Android] 안드로이드 액티비티 생명주기

개요 : 리액트를 공부할 때도 들었던 의문이었지만, 왜 생명주기란 것이 있는지 궁금했었다. 이번에 안드로이드를 공부하면서 생명주기라는 것이 왜 있는지 알게되었고 각 각의 단계들이 어떤

hapen385.tistory.com

 

또한 Fragment는 Activity에 반드시 호스팅되어야 하므로, Activity의 생명주기에도 영향을 받는다. Activity로부터 영향을 받을 때 Fragment도 이에 대한 대응이 필요할 것이다. 호스트 Activity가 갑자기 종료되었을 때 Fragment는 어떻게 반응해야하는지와 같은 상황을 대처하기 위해 Fragment의 생명주기도 필요하다.

 

이렇게 생명 주기를 사용해주면 메모리 누수 또는 애플리케이션 비정상 종료를 방지할 수 있다.

 

2. Fragment 생명 주기 

출처 : Android Developers(https://developer.android.com/guide/components/fragments?hl=ko)

 

Fragment 생명 주기는 위 사진과 같다.

사진을 보면 Activity 생명 주기에서 본 메소드와 비슷한 메소드가 보인다. ex)onCreate(), onStart(), onPause(), onStop(), onDestroy(), onResume(), ...

Activity도 그렇고 Fragment 생명 주기는 모두 운영체제 또는 프로세스에서 실행 중인 프레임워크 코드에서 관리한다.

Fragment 생명 주기 상태는 FragmentManager에서 관리한다.

 

Fragment에는 최소 아래 세 가지 생명 주기 메소드는 구현해줘야 한다.

  • onCreate() : Fragment 생성될 때 호출되는 메소드. Fragment가 중단되었다가 재개될 때 유지하고자 하는 것을 초기화해야 한다.
  • onCreateView() : Fragment가 처음으로 UI를 그리고자 할 때 해당 메소드를 호출. Fragment에 맞는 UI를 그리기 위해서 View를 반환한다. Fragment가 UI를 제공하지 않는 경우, null을 반환.
  • onPause() : 해당 메소드의 호출은 사용자가 Fragment를 닫는다는 첫 번째 신호와 같다. 아직 onDestroyView()까지 가지 않았기 때문에 Fragment가 완전히 삭제되는 것은 아니다. 

 

3. Fragment View와 Fragment 생명 주기

출처 : Android Developers(https://developer.android.com/guide/fragments/lifecycle)

 

 

위 사진은 Fragment View의 상태와 그에 따른 Fragment 콜백 메소드를 나타낸 것이다.

Fragment 콜백 메소드에 onAttach()와 onDetach()가 있지만 생략되었다.

 

Fragment CREATED

사진에는 안나와있지만 onAttach()가 가장 먼저 시행된다.

Fragment CREATED 상태에서는 아직 Fragment의 View는 만들어지지 않았다.

그렇기 때문에 Fragment View와 관련된 작업을 하기에 적절치 않은 시기(?)다.

 

  • onCreate() : Fragment가 FragmentManager에 추가되고 호스트 Activity에 attach될 때 호출된다. 

 

Fragment CREATED & View INITIALIZED

 

  • onCreateView() : 해당 메소드를 호출하면서 Fragment View가 만들어지게 된다. 이때 View 객체를 onCreateView()에서 제공되어야만, Fragment의 Lifecycle이 정상적으로 생성된다. 이 메소드를 재정의하여 개발자가 임의로 View를 생성할 수 있지만, 레이아웃의 Id 값을 받는 Fragment의 생성자로 id 값을 통해 재정의 없이도 Fragment View를 생성할 수 있다.
  • onViewCreated() : onCreateView()에서 만들어진 View 객체를 Parameter로 받는다. 이 메소드 내에서 Fragment View의 초기화를 할 수 있다. 만약 RecyclerView, ViewPager2이 사용된다면, 해당 객체의 Adapter 세팅이 이루어진다.

 

Fragment & View CREATED

현재 Fragment View 이전에 View가 있었을 때 이전 View가 복구될 때 이 상태가 된다.

 

  • onViewStateRestored() : 저장해둔 모든 View의 state 값이 Fragment View 계층 구조(UI는 View는 계층 구조로 이루어져 있다. 추후에 포스팅을 작성해볼 것이다)에 복원됐을 때 호출된다. 예를 들어, CheckBox 위젯이 체크되었는지와 같은 View의 상태를 확인할 수 있다.

View Lifecycle owner(각 View의 생명 주기를 담은 Lifecycle 객체)는 INITIALIZED에서 CREATED로 상태가 바뀌었음을 인지한다.

 

Fragment & View STARTED

Fragment의 View가 사용가능한 상태다.

 

  • onStart() : 호스팅 Activity의 onStart()와 유사한 역할을 한다. Fragment가 사용자에게 보여질 수 있을 때 호출된다. 

View의 상태는 CREATED에서 STARTED로 변경된다.

 

 

Fragment & View RESUMED

Fragment View가 보이고, 애니메이션(Animator)과 Transition 애니메이션 효과가 끝났을 경우 이 상태가 된다.

Fragment가 사용자로부터 interaction을 받을 수 있는 상태다.

 

  • onResume() : Activity의 onResume()과 유사하다. 해당 메소드가 호출되고 RESUMED 상태가 되었을 때는 사용자와 Fragment가 상호작용하기 적절한 상태가 된다. 반대로, 해당 메소드가 호출되지 않았다면 사용자가 입력을 시도하거나 Fragment와 상호작용하기에는 적절치 않은 상태다.

 

Fragment & View STARTED(onPause())

아직 Fragment가 보이는 상태이나, 사용자가 Fragment를 떠나려할 때 이 상태가 된다.

 

  • onPause() : 사용자가 Fragment를 떠났지만, Fragment는 여전히 visible한 상태일 때 호출된다. 

View의 상태는 PAUSED가 아니라 STARTED 상태다.

 

Fragment & View CREATED(onStop(), onSaveInstanceState())

Fragment가 더이상 보이지 않는 상태다. 

출처 : Android Developers(https://developer.android.com/guide/fragments/lifecycle)

API 28 이상부터 위 사진과 같이 변경 사항이 적용되었다.

onStop()이 먼저 호출되고 그 다음에 onSaveInstanceState()가 호출된다.

 

  •  onStop() : 호스팅 Activity나 Fragment가 중단되었을 때 호출된다. 또한 호스팅 Activity나 Fragment의 상태가 저장될 때도 호출된다.
  • onSaveinstanceState() : 호스팅 Activity나 Fragment의 상태, 데이터의 변경을 저장한다.

 

 

Fragment CREATED & View DESTROYED(onDestroyView())

화면으로부터 Fragment가 완전히 사라졌을 때 해당 상태가 된다.

Fragment View의 Lifecycle은 DESTROYED 된다.

이 시기에는 Garbage Collector에 의해 리소스가 수거될 수 있도록 Fragment View에 대한 모든 참조가 제거되어야 한다.

 

  • onDestroyView() : Fragment가 화면에서 없어졌을 때 호출된다.

 

Fragment DESTROYED(onDestroy())

Fragment가 없어지거나 FragmentManager가 없어진다.

 

  • onDestroy() : Fragment Lifecycle의 끝을 알린다. onDestroy() 이후에 onDetach()가 호출된다.

 

Activity 생명 주기를 다뤘을 때보다 복잡한 것 같다.

나중에 Activity 생명 주기에서 빠진 내용이 없었는지 확인해봐야 겠다.

Fragment가 이정도로 내용이 많다면 Activity도 내용이 더 있을 것 같다.

 

생명 주기 이론은 공부할 수 있겠는데, 실습에서 사용하기에는 약간 어려운 감이 있다.

어떨 때 어떤 콜백 메소드를 써야하는지가 헷갈린다.

실습도 많이 해봐야 할 듯하다.

 

 

참조

'Android > etc' 카테고리의 다른 글

[Android] SharedPreferences와 싱글톤 패턴  (0) 2023.03.27
[Android] ViewModel 개념  (0) 2022.08.23
[Android] Jetpack  (0) 2022.06.21
[Android] SharedPreferences  (0) 2022.06.15
[Android] Glide 라이브러리의 사용  (0) 2022.06.11
Comments