본문 바로가기

개발일지

[Android] Fragment 생명주기(Life-Cycle)

Activity 생명주기와 비교했을 때

생성시 onCreateView() -> onViewCreated() -> onViewStateRestored() 추가

파괴시 onSaveInstanceState() -> onDestroyView() 추가

 

 

 

onCreate()

: Fragment만 CREATED 된 상황으로, FragmentManager에 추가되었을 때 호출된다

  • onCreate() 이전에 onAttach() 먼저 호출된다!
  • 아직 Fragment View가 생성되지 않은 시점으로, Fragment의 View 관련 작업은 부적절
  • Bundle 타입으로 savedInstanceState 파라미터가 함께 제공된다 : onSaveInstanceState() 콜백 함수에 의해 저장된 Bundle 값
  • 파라미터는 Fragment가 처음 생성되었을 때만 null로 넘어오며, 그 이후 재생성 되면 onSaveInstanceState() 함수를 재정의하지 않아도 non-null 값으로 넘어온다

 

 

onCreateView(), onViewCreated()

: onCreate() 이후에 호출된다

  • onCreateView()의 반환 값으로 정상적인 Fragment View 객체를 제공했을 때만 Fragment View의 LifeCycle이 생성됨
  • onCreateView()를 재정의하여 Fragment View를 직접 생성, inflate 할 수 있다
  • onCreateView() 재정의 없이도 Layout id를 받는 Fragment의 생성자를 사용하여 해당 리소스 id 값을 통해 Fragment View를 생성할 수도 있다
  • onCreateView()를 통해 반환된 View 객체는 onViewCreated()의 파라미터로 전달된다 : 이 시점부터는 Fragment View의 LifeCycle이 INITIALIZED 상태로 업데이트 된다
  • onViewCreated()에서는 View의 초기값 설정, LiveData 옵저빙, RecyclerView 또는 ViewPager2에 사용될 Adapter 세팅 등이 적절한 작업

 

onViewStateRestored()

: 저장해둔 모든 state 값이 Fragment의 View 계층 구조에 복원되었을 때 호출된다

  • check-box 위젯의 현재 체크 상태 등 각 뷰의 상태 값을 체크할 수 있다
  • View Lifecycle owner는 이 때 INITIALIZED 상태 -> CREATED 상태로 변경됨을 알린다

 

onStart()

: Fragment가 사용자에게 보여질 수 있을 때 호출된다

  • Fragment가 attach 되어있는 Activity의 onStart() 시점과 유사하다
  • 이 시점부터 Fragment의 child FragmentManager를 통해 FragmentTransaction을 안전하게 수행할 수 있다
  • Fragment의 Lifecycle이 STARTED로 이동한 후 Fragment View의 lifecycle 또한 STARTED로 변환된다

 

onResume()

: Fragment가 보이는 상태에서 모든 Animator와 Transition 효과가 종료되고, Fragment가 사용자와 상호작용 할 수 있을 때 호출된다

  • Activity의 onResume() 시점과 유사하다
  • RESUMED 상태 : 사용자가 Fragment와 상호작용하기에 적절한 상태 -> 이는 반대로, onResume()이 호출되지 않은 시점에서는 입력을 시도하거나 포커스를 설정하는 임의의 작업을 하면 안된다는 것을 의미

 

onPause()

: 사용자가 Fragment를 떠나기 시작했지만 여전히 visible일 때 호출된다

  • 주의! Fragment와 View의 Lifecycle은 PAUSED가 아닌 STARTED가 된다

 

onStop()

: 부모 Activity나 Fragment가 중단되었을 때, 부모 Activity나 Fragment 상태가 저장될 때 호출된다

  • Fragment가 더 이상 화면이 보여지지 않을 때 Fragment와 View의 Lifecycle은 CREATED 상태가 되고 onStop() 콜백함수가 호출된다
  • API 28 이상부터 onStop()이 onSaveInstanceState()보다 먼저 호출됨 -> FragmentTransaction을 안전히 수행할 수 있는 마지막 지점은 onStop()

 

 

onDestroy()

: Fragment가 제거되거나 Fragment Manager가 Destroy된 경우, Fragment View의 Lifecycle은 DESTROYED가 되며 onDestroy()가 호출된다

  • 해당 지점은 Fragment Lifecycle의 끝을 알린다
  • onAttach()가 onCreate() 이전에 호출된 것처럼, onDetach()는 onDestroy() 이후에 호출된다