Android

[Android] Fragment와 Fragment 생명 주기

JunsuKim 2022. 8. 15.
728x90

Fragment란?

Fragment = Activity + View라고 볼 수 있다. 즉, Activity의 개념과 View의 개념이 합쳐진 것이다.

Activity와 View의 개념을 떠올려보자.

  • View: 레이아웃, 위젯과 같이 액티비티 상에서 틀을 잡거나, 우리에게 보이는 버튼, 뷰 등등
  • Activity: View를 담을 수 있는 화면

그렇다면 Fragment는 무엇일까?

Fragment는 Activity가 담을 수 있는 또 다른 화면이라고 생각하면 된다.

 

이제 다음과 같은 생각이 들 수 있다. "어? Activity와 Fragment가 둘 다 화면이라면 굳이 구분을 해야 할까? 그냥 Activity만 쓰면 안될까?" 이제부터 이 궁금증을 해결해보자.

  1.  Activity는 Fragment에 비해 상당히 무겁고, 리소스를 많이 잡아먹는다.
  2. 하나의 Activity에서 A화면, B화면, C화면 등 다양한 화면으로 화면 전환을 해야 할 때, Fragment를 사용하면 보다 효율적이다. 대부분의 프로젝트는 Single Activity - Multi Fragment 형태를 가지고 있다.
  3. 태블릿처럼 화면이 클 때, 같은 애플리케이션이더라도 Activity의 구성이 다른 것을 종종 확인할 수 있다.  아래의 그림에서 왼쪽은 스마트폰, 오른쪽은 태블릿의 Play Store 화면이다. 이처럼 두 화면의 구성이 다른 이유는 한 Activity의 화면 요소를 Fragment 단위로 나누어 관리하였기 때문이다. 이를 통해 레이아웃을 분리해 관리할 수 있고, 복잡도를 줄일 수 있다.

Fragment의 특징

  • Activity를 분할하여 화면의 각 부분들을 정의한다.
  • 다른 Activity에서 재사용이 가능하다.
  • Activity와 같이 레이아웃, 동작처리, LifeCycle(생명주기)이 있다.
  • Activity 실행 중 생성, 교체, 삭제가 가능하다.
  • 무조건 Activity에 종속되어야 한다.

Fragment 생명주기

출처: Android Developer

각각의 기능들에 대해 알아보자.

onCreate()

Fragment가 Activity에 Attach될 때 호출된다.

즉, FragmentManager에 Fragment가 전달되었을 때 onCreate() 콜백 함수를 호출한다.

onCreateView()

Fragment가 View를 그리기 위한 콜백으로, 레이아웃을 inflate하는 곳이다.

View의 초기값을 설정하는 로직이 들어가며, 따라서 반환값도 View다.

다만 UI를 아직 설정하지 않았다면 null을 반환하기도 한다.

onViewCreated()

onCreateView()가 호출된 후 onViewCreated()가 호출된다.

onViewCreated()가 호출된 시점부터 Fragment View의 생명 주기가 Initialized 상태로 업데이트되므로 View의 초기값을 설정해주기 적절하다.

onViewStateRestored()

Fragment에 속하는 View들의 상태 값을 모두 읽어왔을 때 호출된다.

예를 들어, 체크 박스 위젯이 현재 체크된 상태인지 등 각 뷰의 상태를 체크할 수 있다.

onStart()

Fragment가 사용자에게 보여질 때 호출된다. 

Fragment 안에 또 다른 Fragment가 있을 때, onStart() 부분에서 FragmentManager를 통해 FragmentTransaction 수행이 가능하다.

onResume()

onResume()이 호출되고부터 사용자와 Fragment가 상호작용이 가능하다. 

onPause()

사용자가 Fragment를 떠날 때, onPause()가 호출된다.

onStop()

사용자가 Fragment를 떠나 더 이상 보이지 않게 되면 호출된다.

사용자가 해당 Fragment를 다시 호출하면 복원 가능하다.

onSaveInstanceState()

Fragment에 현재 동적 상태를 저장하도록 요청하기 위해 호출된다.

후에 프로세스가 다시 시작될 경우 새 인스턴스에서 재구성할 수 있다.

프래그먼트의 새 인스턴스를 만들어야 하는 경우 이 콜백의 Bundle에 배치한 데이터를 onCreate, onCreateView 및 onViewCreated의 Bundle에서 사용할 수 있다.

onDestroyView()

Fragment와 관련된 View가 완전히 벗어났을 경우 호출된다.

onDestroy()

onDestroyView()에서 View가 제거된 후에 호출된다.

 

간단하게 Fragment를 이용한 화면 전환을 구현하여 LifeCycle이 어떻게 작동되는지 알아보도록 하자.

구현

https://github.com/junsu1023/Android-Study/tree/fragment

 

GitHub - junsu1023/Android-Study

Contribute to junsu1023/Android-Study development by creating an account on GitHub.

github.com

코드를 확인하고 싶다면 깃허브에서 위의 깃허브에서 확인하면 된다.

Fragment 호출 시

 

onCreate() -> onCreateView() -> onViewCreated() -> onViewStateRestored() -> onStart() 순으로 호출되는 것을 확인할 수 있다.

FragmentA에서 FragmentB로 전환 시 FragmentA의 LifeCycle 상태

onPause() -> onStop() -> onDestroyView() -> OnDestroy() 순으로 호출되는 것을 확인할 수 있다.

FragmentA가 화면에서 완전히 사라지므로 onDestroy()까지 호출된다.

다시 FragmentA로 전환

onCreate() -> onCreateView() -> onViewCreated() -> onViewStateRestored() -> onStart() 순으로 호출되는 것을 확인할 수 있다.

즉, Fragment가 처음부터 생성된 것이다.

FragmentA 상태에서 앱을 나갔을 때

onPause() -> onStop() -> onSaveInstanceState() 순으로 호출된다.

앱에 다시 접속

onStart() -> onResume() 순으로 호출된다.

728x90

댓글