Android

Fragment

haechan29 2023. 12. 9. 11:12
더보기

[Android Basic] 시리즈

1. Clean Architecture

2. Retrofit

3. Activity

4. Fragment

5. Coroutine

 

이 글은 Fragment의 Lifecycle에 대해서 다룹니다.

 


Fragment의 Lifecycle은 Activity와 비슷한 점이 많아요. Activity Lifecycle과 같이 Created, Started, Resumed의 상태를 가지고, 상태가 변할 때 onCreate(), onStart() 등의 수명주기 메서드를 호출합니다.

 

그래서 이 글에서는 Activity Lifecycle과의 차이점을 중심으로 알아보려고 해요. 구체적으로는

1. Fragment Lifecycle

2. Activity Lifecycle and Fragment Lifecycle

3. With LiveData

의 순서로 Fragment Lifecycle을 설명하려고 합니다.

 

1. Fragment Lifecycle (+ View Lifecycle)

Fragment의 Lifecycle을 보기 전에 알아둬야 할 사실이 있어요. Activity와 다르게, Fragment는 리소스를 연결하기 위한 내부의 View를 따로 가지고 있다는 것입니다.

 

처음부터 Fragment는 태블릿같은 대형 화면을 유연하게 구성하기 위해 만들어졌어요. 그래서 Fragment는 독립적으로 존재하는 것이 아니라 Activity에 종속되어 있고, Activity에 비해 재사용성이 훨씬 높아요.

 

자세히는 모르지만, 이러한 이유로 Activity와 다르게 내부에 View를 따로 가지고 있는 듯 해요. 그래서 Fragment를 사용할 때는 내부의 View의 수명주기를 고려해야 해요. 말은 복잡하지만 사실 알아둬야 할 건 거의 없으니 너무 겁먹지 않으셔도 돼요 😊

 

그럼 본격적으로 Fragment와 View의 Lifecycle에 대해서 알아봐요.

 

Fragment Lifecycle

 

그림의 왼쪽이 Fragment, 오른쪽이 View의 Lifecycle에요. CREATED 상태만 제외하고는 Activity의 Lifecycle과 똑같죠?

 

CREATED 상태에서 onCreateView()와 onViewCreated()라는 처음 보는 메서드가 등장하는데요, 이름 그대로 Fragment 내부의 View를 초기화하는 상태에요. 특히 Fragment가 리소스가 연결된 이후에 호출되는 함수가 onViewCreated()이기 때문에 Fragment의 리스소에 접근하는 코드는 onCreateView()가 아니라, onViewCreated()에 작성해야 해요.

 

2. Activity Lifecycle and Fragment Lifecycle

Fragment는 Activity에 종속되어 있기 때문에 Fragment Lifecycle과 Activity Lifecycle은 같이 고려해야 해요. Fragment Lifecycle은 Activity와 거의 비슷하게 움직여요.

Activity의 리소스를 연결할 때 Fragment도 같이 초기화돼요. 그래서 Activity#onCreate() 메서드에서 Fragment#onAttach(), Fragment#onCreate() 등의 메서드를 호출해요.

 

이후에 Fragment를 교체할 때 Fragment가 파괴되었다가 재생성되고, 최종적으로 Activity를 종료할 때 Fragment도 같이 파괴돼요.

 

Activity와 Fragment의 생명주기 메서드가 호출되는 순서는 아래 글에서 구체적으로 확인할 수 있어요.

 

[Android] 의외로 잘 모르는 Fragment 의 Lifecycle

많은 앱들이 여러가지 이유로 single activity application 을 지향하고 있습니다. 따라서 Fragment 로 UI 를 구성하는 경우가 굉장히 많은데요. 이때 많은 개발자들이 Activity 의 Lifecycle 에 대해서는 잘 알고

readystory.tistory.com

 

3. With LiveData

Fragment의 생명주기에 따라 작업을 실행해야 할 때가 있습니다. 이때 LifecycleOwner을 사용할 수 있는데, Fragment 내부에는 LifecycleOwner과 ViewLifecyclerOwner가 있어요. 그 중에서 LifecycleOwner는 Fragment의 생명주기를 다루고, ViewLifecyclerOwner는 Fragment 내부의 View의 생명주기를 다룹니다.

 

LiveData를 이용할때도 LifecycleOwner을 넘겨주는데, LiveData에 LifecyclerOwner을 전달할 때는 ViewLifecycleOwner을 이용해야 합니다.

 

왜냐면 Fragment가 재활용되면서 Fragment는 destroy되지 않아도, View는 destroy될 수 있기 때문이에요.(= onDestroyView()가 호출되었지만 onDestroy()가 호출되지 않은 상태) 이 경우 만약 Fragment의 Lifecycle에 따라 LiveData의 갱신을 중단할 경우, Fragment의 View가 파괴되었지만 LiveData를 여전히 갱신하는 상황이 발생할 수 있습니다.

 


여기까지 Fragment의 Lifecycle을 알아보고, 이를 Activity Lifecycle과 함께 살펴봤어요.

읽어주셔서 감사합니다~ 질문이나 틀린 내용에 대한 이야기는 댓글로 달아주세요 😉

 


참고자료

프래그먼트 수명 주기(공식 문서)

Activity vs Fragment, 무엇을 선택해야 할까?

[Android] 의외로 잘 모르는 Fragment 의 Lifecycle

Fragment에 대해 알아보자 | Android Study

[Android] LifecycleOwner vs viewLifecycleOwner in Fragment