Fragment
하나의 액티비티 내에서 독립적으로 동작하는 화면 부분을 말한다.
액티비티는 독립적으로 화면을 표시하고 앱 내에서 독립적으로 실행될 수 있는 반면에, 프래그먼트는 액티비티에 종속되며, 액티비티 내에서 사용되어 화면을 나누는데 도움을 준다.
FragmentManager
프래그먼트의 추가, 삭제, 교체 등을 담당하는 클래스로, 호스트 액티비티에 프래그먼트를 연결하고 프래그먼트가 더 이상 사용되지 않으면 분리하는 역할을 한다.
프래그먼트의 생명주기는 호스트 액비비티 혹은 호스트 프래그먼트의 생명주기보다 앞설 수 없는데, 이러한 프래그래먼트의 트랜잭션을 안정적으로 처리할 수 있는 FragmentContainerView
를 사용하는 것이 권장된다.
Fragment LifeCycle
onAttach()
프래그먼트가 액티비티에 연결될 때 호출된다.
onCreate()
프래그먼트가 FragmentManager
에 추가되면 호출되며, 뷰는 생성되지 않은 상태이다.
onCreateView()
프래그먼트가 뷰를 그리기 위해 레이아웃을 Inflate
하는 작업을 수행할 때 호출되며, 뷰 객체를 반환한다.
Inflate
는 XML
에 정의된 레이아웃과 뷰의 속성을 읽어 실제 뷰 객체를 만드는 작업을 말한다.
onViewCreated()
onCreateView()
에서 생성된 뷰 객체를 전달 받으면 호출되고, 이 시점부터 뷰에 대한 작업을 처리할 수 있다.
onViewStateRestored()
저장된 뷰의 상태값이 프래그먼트의 뷰에 복원되었을 때 호출된다.
onStart()
프래그먼트가 화면에 보이기 직전에 호출되며, 이때부터 프래그먼트의 childFragmentManager
를 통해서 FragmentTransaction
을 안전하게 수행할 수 있다.
onResume()
프래그먼트가 사용자와 상호작용이 가능해지면 호출된다.
onPause()
프래그먼트가 사용자와 상호작용이 불가능해지면 호출된다.
onStop()
프래그먼트가 화면에서 완전히 보이지 않게 되면 호출되며, onSaveInstanceState()
보다 먼저 호출되기 때문에 FragmentTransaction
이 안전하게 수행되는 마지막 지점이다.
onSaveInstanceState()
생명주기 Callback
함수가 아니라 화면 회전과 같이 Configuration
변경이 발생했을 때 데이터를 저장하기 위해 사용하는 함수이다.
onDestoryView()
프래그먼트의 뷰가 제거되면 호출된다.
onDestory()
프래그먼트가 FragmentManager
에서 제거되면 호출된다.
onDetach()
프래그먼트가 액티비티에서 완전히 제거되면 호출된다.
Fragment A & B 의 동작
A 생성
A: onAttach
A: onCreate
A: onCreateView
A: onViewCreated
A: onViewStateRestored
A: onStart
A: onResume
A
프래그먼트가 생성되면서 프래그먼트의 생명주기대로 호출된다.
A → B 이동
A: onPause
A: onStop
B: onAttach
B: onCreate
B: onCreateView
B: onViewCreated
B: onViewStateRestored
B: onStart
B: onResume
A: onDestoryView
- 프래그먼트
A
에서onPause()
,onStop()
이 호출되고, 프래그먼트B
가 생성되면서 프래그먼트의 생명주기대로 호출된다. - 프래그먼트
B
가 사용자와 상호작용이 가능해져onResume()
이 호출되면, 프래그먼트A
에서onDestoryView()
가 호출된다. - 액티비티에서는 A → B 로 이동할 때 액티비티
A
에서onPause()
까지만 호출되고 액티비티B
에서 상호작용이 가능해지면onStop()
이 호출되었던 것과는 다르게, 프래그먼트에서는onStop()
까지 한 번에 호출되는 것을 확인할 수 있다.
B → A 뒤로가기
B: onPause
B: onStop
A: onCreateView
A: onViewCreated
A: onViewStateRestored
A: onStart
A: onResume
B: onDestoryView
B: onDestory
B: onDetach
- 프래그먼트
B
에서onPause()
,onStop()
이 호출되고 프래그먼트A
에서onCreateView()
부터onResume()
까지 다시 호출된다. - 프래그먼트
A
가 다시 사용자와 상호작용이 가능해져onResume()
이 호출되면, 프래그먼트B
에서onDestoryView()
,onDestory()
,onDetach()
를 호출하여 백스택에서 자신을 제거한다.
Fragment View LifeCycle
프래그먼트의 ViewLifeCycleOnwer
는 onCreateView()
에서 생성되는 뷰의 생명주기를 말하며, onCreateView()
부터 onDestoryView()
까지의 생명주기를 가진다.