[Android] Lifecycle - Fragment

HEETAE HEO·2022년 5월 18일
0

Lifecycle

목록 보기
2/3
post-thumbnail

이전 글인 Activity Lifecycle에 이어서 Fragment에 관한 글을 작성해보려고 합니다.

다음은 Android 공식문서에 있는 Fragment Lifecycle 생명주기 표입니다.

Activity의 콜백 함수와 달리 onViewCreated() onViewStateRestored()와 같은 몇몇 함수들이 추가적으로 있는 것을 확인할 수 있습니다.

이미지를 보면 Fragment Lifecycle과 View Lifecycle이 상이한 것을 볼 수있는데 Fragment의 Lifecycle이 변화되는 순간 Fragment Callback 함수를 호출하게 되고 해당 콜백함수가 종료되는 시점에 View의 Lifecycle에 이벤트를 전달하게 됩니다.

onCreate()

Fragment만 Created된 상황으로 FragmentManager에 add 됐을 때 도달하며 onCreate()함수를 호출합니다. 정확하게는 onCreate()이전에 onAttach()가 먼저 호출된다는 것입니다. 이 시점에서는 View가 생성되지않았기에 View와 관련된 작업을 두기에는 적절하지않습니다.

해당 시점에서 Bundle 타입으로 savedInstanceState 파라미터가 함께 제공이 되는데 이는 onSaveInstanceState() 콜백 함수에 의에 저장된 Bundle 값입니다. 여기서 또 알아야할 부분은 savedInstanceState 파라미터는 Fragment가 처음 생성되었을 때만 null로 넘어오며 , onSaveInstanceState()함수를 재정의 하지않았더라 재 생성부터는 non-null로 값을 받아옵니다.

onCreateView(), onViewCreated()

onCreate 다음에 호출되는 콜백함수들인데 onCreateView()의 반환값으로 정상적인 Fragment View 객체를 제공했을 때만 Fragment View의 Lifecycle이 생성된다.

onCreateView()를 재정의 하여 Fragment View를 직접 생성하지않고 inflate할 수 있지만 Layoutid를 받는 Fragment의 생성자를 사용하여 해당 리소스 아이디 값을 통해 onCreateView의 재정의 없이 Fragment View를 생성할 수도 있습니다.

onViewStateRestored()

해당 콜백 함수는 저장해둔 모든 state값이 fragment의 View 계층구조에 복원 됐을 때 호출됩니다. 따라서 각 View의 상태값을 체크할 수 있습니다.

View Lifecycle owner는 이때 INITIALIZED상태로 CREATED 상태로 변경되었음을 알립니다.

onStart()

Fragment가 사용자에게 보여질 수 있을 때 호출됩니다. 이는 주로 Fragment가 attach되어있는 Activity의 onStart() 시점과 유사한데 이 시점부터 Fragment의 child FragmentManager을 통해 Transaction을 안전하게 수행할 수 있습니다.

Fragment의 Lifecycle이 STARTED 되어야지 View 또한 STARTED로 이동한다.

onResume()

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

Resumed 상태가 됐다는 것은 사용자가 Fragment와 상호작용하기에 적절한 상태가 됐다고 했는데 이는 반대로 onResume()이 호출되지 않은 시점에서는 입력을 시도하거나 포커스를 설정하는 등의 작업을 임의로 하면 안된다는 것을 의미한다.

onPause()

사용자가 Fragment를 떠나기 시작했찌만 Fragment는 여전히 visible일 때 onPause()가 호출됩니다.

여기서 특이점은 Fragment와 View의 Lifecycle이 pause가 아닌 Started가 된다는 것 입니다. 이는 View의 Lifecycle에 pause와 stop의 형태가 없다는 것입니다.

onDestroy()

Fragment가 제거되거나 FragmentManager가 destroy 됐을 경우 Fragment의 Lifecycle은 Destroyed 상태가 되고 onDestroyed 콜백함수가 호출됩니다. 해당 지점은 Fragment Lifecycle의 끝을 알리는 것입니다.

Fragment 전환 순서

MainFragment(시작 Fragment) , SubFragment

1. FragmentTransaction을 통해 Fragment위에 Fragment를 add하는 경우

add의 경우는
add() - SubFragment -> onAttach -> onCreate -> onCreateView -> onViewCreated -> onViewStateRestored -> onStart -> onResume

2. Fragment를 replace하는 경우

replace() - SubFragment ->MainFragment - onPause -> MainFragment onStop-> onAttach -> onCreate -> onCreateView -> onViewCreated -> onViewStateRestored -> onStart -> MainFragment - onDestroyView -> MainFragment - onDestroy -> MainFragment - onDetach -> onResume

3. Fragment를 replace하면서 addToBackStack하는 경우

replace() - SubFragment -> MainFragment - onPause -> MainFragment onStop -> onAttach -> onCreate -> onCreateView -> onViewCreated -> onViewStateRestored -> onStart -> MainFragment - onDestroyView -> onResume

4. Home 버튼을 통해 화면을 나간 경우

Home Button -> MainFragment onpause -> MainFragment onStop -> MainFragment onSaveInstanceState

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글