이전 글
오늘은 지난 번에 이어서 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 함수가 호출된다.
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가 저장되지 않는다.)
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 참조를 모두 제거하여 메모리 누수 방지(가비지 컬렉터)
- Activity와 비교
참고 자료
https://developer.android.com/guide/fragments/lifecycle
추후 작성할 글
- onCreateView에서 사용하는 함수의 Parameter 의미
- FragmentManager와 Fragment Transaction
- Lifecycle aware component
- Fragment 간 화면 이동
'Android' 카테고리의 다른 글
[적용기] Clean Architecture는 정말 좋을까? (2) | 2023.05.13 |
---|---|
[적용기] MVVM ViewModel과 AAC ViewModel (4) | 2023.05.10 |
[TIL/개념] Android의 Context와 ApplicationContext (0) | 2023.04.30 |
[TIL/개념] Activity와 Fragment (1) - Activity와 Activity의 lifecycle (0) | 2023.03.21 |
[TIL/개념] 의존성 주입(Dependency injection, DI) 기초 (0) | 2023.03.09 |