Bibbidi Bobbidi Boo
article thumbnail

이전 글

 

Activity와 Fragment - 1. (1) Activity, (2) Activity의 lifecycle

Android를 처음 개발하면 접하게 되는 Activity, 그리고 fragment! 기본 중 기본이며, ✨면접 필수 질문✨으로 매우 매우 중요하다!! 0. 목차 Activity Activity란? Activity의 lifecycle Fragment Fragment란? Fragment의 lif

sjevie.tistory.com

 

오늘은 지난 번에 이어서 Fragment와 Fragment의 lifecycle에 대해 알아보자.

 


Fragment

Fragment란?

 

Fragment에 대해서 공식 문서에는 다음처럼 이야기한다.

A Fragment represents a reusable portion of your app's UI.

직역하면 앱 UI에서 재사용이 가능한 부분을 Fragment라고 한다.

 

Activity와 달리 Fragment는 단독으로 존재할 수 없으며, Host Fragment 위에 존재해야 한다.

그리고 Host Fragment는 Activity 위에 존재하게 된다.

* 추후 Activity와 Fragment의 관계를 포스팅할 것.

 

언제 필요한가?

사실 Fragment 없이 Activity만으로 우리는 앱의 UI를 구성하는 것이 가능하다.

 

그럼 Fragment를 사용했을 때 장점은 무엇일까?

 

Fragment를 소개하는 공식 문서에서 다음과 같은 문장이 있다.

Fragments introduce modularity and reusability into your activity’s UI by letting you divide the UI into discrete chunks

Fragment는 Activity의 ui에 Modularity(모듈성)과 Reusability(재사용성)을 주게 된다.

 

Fragment는 앱의 전체 ui가 아닌 일부 ui를 정의내리고 관리하는, 즉 모듈성을 제공한다.

앱의 여러 곳에서 재사용되는 ui를 분리해 Fragment로 만들면 내가 필요할 때마다 불러서 사용할 수 있게 된다.

이를 통해서 개발과 유지 보수가 용이하게 된다.

 

Fragment의 Lifecycle

Fragment도 Activity처럼 자체적인 Lifecycle이 존재하며, 상태에 따라 lifecycle-callback 함수가 호출된다.

https://developer.android.com/guide/fragments/lifecycle#states

Activity의 Lifecycle과 비교했을 때, 약간 비슷하지만 다른 점이 몇 가지 있다.

 

생성 시에는 onCreateView() - onViewCreated() 가 onCreate() 뒤에 추가로 붙고,

파괴 시에는 onSaveInstanceState() - onDestoryView()가 onDestory() 앞에 추가로 붙는다.

 

또한 Fragment와 View의 Lifecycle이 다르다는 점도 위에서 발견할 수 있다.

 

그렇다면 각 Lifecycle-callback은 언제 호출되고, 적합한 작업이 무엇인지 알아보자.

 

onCreate() : Fragment - CREATED

 

onCreate()는 Fragment가 생성될 때 호출되며, 아직 View가 생성되지 않은 시점이다.

때문에 View와 관련된 작업을 진행해선 안된다.

Fragment의 멤버 변수나 혹은 Aragument 값을 가져와서 처리하는 작업을 수행할 수 있다.

 

 

onCreateView(), onViewCreated() : Fragment - CREATED, View - INITIALIZED

 

onCreateView()는 Fragment의 View를 생성하기 시작할 때 호출된다.

이때는 view를 inflate하고 반환한다.

(반환된 view는 이 다음 수행되는 onViewCreated()의 파라미터로 전달된다.)

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_blank, container, false)
}

onViewCreated()는 onCreateView()가 완료되고 호출된다.

View를 초기화하거나 Adapter 설정 등이 여기에 포함될 수 있다.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
}

 

 

onViewStateRestored() : Fragment, View - CREATED

 

onViewStateRestored()는 모든 저장된 state 값이 Fragment 의 View의 계층으로 복원되었을 때 호출된다.

Checkbox 위젯의 선택 여부 등 저장된 state 값을 추적하여 초기화하는 작업을 수행할 수 있다.

 

 

onStart() : Fragment, View - STARTED

 

onStart()는 Fragment가 사용자에게 보여질 때 호출되며, 일반적으로 Activity의 onStart()와 연관이 있다.

이 시점에는 Fragment의 chlid FragmentManager를 통해서 FragmentTransaction을 수행하기 좋다.

 

 

onResume() : Fragment, View - RESUMED

 

onResume()은 Fragment가 보이는 상태에서 모든 Animator와 Transition 효과가 종료되고, Fragment가 사용자와 상호작용할 수 있을 때 호출된다. onStart()처럼 Activity의 onResume()과 연관이 있다.

 

 

onPause() : Fragment, View - STARTED

 

onPause()는 Fragment가 더 이상 RESUMED 상태가 아닐 때, 즉 보이지만 상호작용이 불가능한 상태일 때 호출된다.

마찬가지로 Activity의 onPause()와 연관이 있다.

 

 

onStop(), onSaveInstanceState() : Fragment, View - CREATED

 

onStop()은 Fragment가 더 이상 STARTED가 아닐 때, 즉 보이지 않게 된 상태일 때 호출되며, 마찬가지로 Activity의 onStop()와 연관이 있다. 

Fragment와 View가 STARTED -> CREATED 으로 변하고, ON_STOP Event를 emit 한다.

이 상태는 부모 activity나 fragment가 stop 되었을 때 뿐만이 아닌, State를 저장할 때도 호출된다.

 

또한 API 28 전후로 onStop()과 onSaveInstanceState() 호출 순서가 상이한데,

API 28 이전에는 onSaveInstanceState() - onStop() 순이었다면,

API 28 이후에는 onStop() - onSaveInstanceState()로 바뀌었다.

(때문에 API 28 이후로는 State를 저장하는 onSaveInstanceState() 전에 수행되는 onStop() 때는 State가 저장되지 않는다.)

https://developer.android.com/guide/fragments/lifecycle#fragment_and_view_created_2

 

 

onDestoryView() : Fragment - CREATED, View - DESTROYED

 

onDestoryView()는 종료 애니메이션과 Transition이 완료되고, Fragment의 View가 화면에서 분리될 때 호출된다.

이 시점에서 View는 Lifecycle이 끝나며, getViewLifecycleOwnerLiveData를 호출하면 null을 반환한다.

 

이 때는 Fragment가 가진 View 참조를 모두 제거하여 메모리 누수를 방지해야 한다.

* 추후 왜 Fragment에서는 binding을 null 처리해주어야 하는가?에 대해 포스팅하기

 

 

onDestory() : Fragment - DESTROYED

 

onDestory()는 Fragment가 제거되거나 FragmentManager가 파괴될 때 호출된다.

이 시점에서 Fragment의 Lifecycle이 끝나게 된다.

 


요약

  • Fragment란?
    • 앱 UI에서 재사용이 가능한 부분
    • 단독으로 존재할 수 없음
  • Fragment의 Modularity와 Resusbility
    • 재사용되는 ui를 분리해서 내가 필요할 때마다 불러서 사용
    • 개발과 유지 보수가 용이
  • Fragment의 Lifecyce
    • Activity와 비교
      • 생성 시 onCreate() - onCreateView() - onViewCreated()
      • 파괴 시 onSaveInstanceState() - onDestoryView() - onDestory()
    • onCreate()
      • Fragment가 생성될 때 호출
      • View가 아직 생성 X
      • Fragment의 멤버 변수나 Aragument의 값을 가져와서 처리하는 작업 등
    • onCreateView()
      • Fragment의 View를 생성하기 시작할 때 호출
      • view를 inflate 하고 반환
      • 반환된 view는 onViewCreated()의 파라미터로 전달되므로 View의 초기화를 onCreateView()에서 하는 것은 권장되지 않음
    • onViewCreated()
      • onCreateView()가 완료되고 호출
      • View를 초기화하거나 Adapter를 설정
    • onDestoryView()
      • 종료 애니메이션과 Transition이 완료되고, Fragment의 View가 화면에서 분리될 때 호출
      • View의 Lifecycle 종료
      • Fragment가 가진 View 참조를 모두 제거하여 메모리 누수 방지(가비지 컬렉터)

 

참고 자료

https://developer.android.com/guide/fragments/lifecycle

 

Fragment lifecycle  |  Android Developers

Fragment lifecycle Stay organized with collections Save and categorize content based on your preferences. Each Fragment instance has its own lifecycle. When a user navigates and interacts with your app, your fragments transition through various states in t

developer.android.com

 

추후 작성할 글

  • onCreateView에서 사용하는 함수의 Parameter 의미
  • FragmentManager와 Fragment Transaction
  • Lifecycle aware component
  • Fragment 간 화면 이동
profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!