[개념] Fragment(프래그먼트) Lifecycle

쓰리원·2022년 5월 13일
0

Lifecycle

목록 보기
3/4
post-thumbnail

Fragment(프래그먼트) Lifecycle를 공식문서를 통해 알아보겠습니다. 글 마다 맨 위는 간략히 요약 내용으로 구성 하였습니다.

1. 프래그먼트란?

Fragment는 FragmentActivity 내의 어떤 동작 또는 사용자 인터페이스의 일부를 나타냅니다. 여러 개의 프래그먼트를 하나의 액티비티에 결합하여 창이 여러 개인 UI를 빌드할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재사용할 수 있습니다. 프래그먼트는 액티비티의 모듈식 섹션이라고 생각하면 됩니다. 이는 자체적인 수명 주기를 가지고, 자체 입력 이벤트를 수신하고, 액티비티 실행 중에 추가 및 삭제가 가능합니다(다른 액티비티에 재사용할 수 있는 "하위 액티비티"와 같은 개념).

2. 프래그먼트 사용법

프래그먼트를 액티비티 레이아웃에 추가하면, 해당 프래그먼트는 액티비티의 뷰 계층 내에서 ViewGroup에 들어가고 자체적인 뷰 레이아웃을 정의합니다. 액티비티의 레이아웃 파일에서 요소로 프래그먼트를 선언하거나 기존 ViewGroup에 추가하는 방법으로 애플리케이션 코드에서 프래그먼트를 선언하면 액티비티 레이아웃에 프래그먼트를 삽입할 수 있습니다.

프래그먼트는 항상 액티비티 내에서 호스팅되어야 하며 해당 프래그먼트의 수명 주기는 호스트 액티비티의 수명 주기에 직접적으로 영향을 받습니다. 예를 들어 액티비티가 일시정지되는 경우, 그 안의 모든 프래그먼트도 일시정지되며 액티비티가 소멸되면 모든 프래그먼트도 마찬가지로 소멸됩니다. 그러나 액티비티가 실행 중인 동안(Resumed(재개됨) 수명 주기 상태에 있을 경우)에는 각 프래그먼트를 추가 또는 제거하는 등 개별적으로 조작할 수 있습니다. 그와 같은 프래그먼트 트랜잭션을 수행할 때는 이를 액티비티가 관리하는 백 스택에도 추가할 수 있습니다. 각 백 스택 항목이 발생한 프래그먼트 트랜잭션의 기록이 됩니다. 이 백 스택을 사용하면 사용자가 프래그먼트 트랜잭션을 거꾸로 돌릴 수 있습니다(뒤로 이동). 이때 Back 버튼을 누르면 됩니다.

이 문서에서는 프래그먼트를 사용하도록 애플리케이션을 빌드하는 방법을 설명합니다. 여기에는 프래그먼트를 액티비티의 백 스택에 추가했을 때 프래그먼트가 자신의 상태를 유지하는 방법, 액티비티 및 액티비티 내의 다른 프래그먼트와 이벤트를 공유하는 방법, 액티비티의 앱 바에 참가하는 방법 등 여러 가지가 포함됩니다.

3. 프래그먼트 필수 생성 메서드

프래그먼트를 생성하려면 Fragment의 하위 클래스(또는 이것의 기존 하위 클래스)를 생성해야 합니다. Fragment 클래스에는 Activity와 아주 유사해 보이는 코드가 있습니다. 여기에는 액티비티와 비슷한 콜백 메서드가 들어 있습니다. 예를 들어 onCreate(), onStart(), onPause() 및 onStop() 등입니다.

사실, 기존 Android 애플리케이션을 변환하여 프래그먼트를 사용하게 하려면 단순히 액티비티의 콜백 메서드에서 프래그먼트에 해당되는 콜백 메서드로 코드를 옮기기만 하면 될 수도 있습니다. 보통은 최소한 다음과 같은 수명 주기 메서드를 구현해야 합니다.

1. onCreate()

프래그먼트를 생성할 때 시스템에서 이것을 호출합니다. 구현 내에서 프래그먼트의 기본 구성 요소 중 프래그먼트가 일시정지되거나 중단되었다가 재개되었을 때 유지하고자 하는 것을 초기화해야 합니다.

2. onCreateView()

시스템은 프래그먼트가 자신의 사용자 인터페이스를 처음으로 그릴 시간이 되면 이것을 호출합니다. 프래그먼트에 맞는 UI를 그리려면 메서드에서 View를 반환해야 합니다. 이 메서드는 프래그먼트 레이아웃의 루트입니다. 프래그먼트가 UI를 제공하지 않는 경우 null을 반환하면 됩니다.

3. onPause()

시스템이 이 메서드를 호출하는 것은 사용자가 프래그먼트를 떠난다는 것을 나타내는 첫 번째 신호입니다(다만 항상 프래그먼트가 소멸 중이라는 것을 의미하지는 않습니다). 일반적으로 여기에서 현재 사용자 세션을 넘어서 지속되어야 하는 변경 사항을 커밋합니다(사용자가 돌아오지 않을 수 있기 때문입니다).

대부분의 애플리케이션은 각각의 프래그먼트에 이와 같은 메서드를 최소한 세 개씩 구현해야 하지만, 프래그먼트 수명 주기의 여러 단계를 처리하는 데 사용해야 하는 다른 콜백 메서드도 많이 있습니다. 모든 수명 주기 콜백 메서드는 아래의 프래그먼트 수명 주기 처리 섹션에서 더욱 상세히 논의할 것입니다.

4. 프래그먼트 수명 주기 처리

프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷합니다. 액티비티와 마찬가지로 프래그먼트는 세 가지 상태로 존재할 수 있습니다. 그 주요 3가지 상태에 대해 알아보겠습니다.

1. 재개됨(Resumed)

프래그먼트가 실행 중인 액티비티에 표시됩니다.

2. 일시정지됨(Paused)

다른 액티비티가 포그라운드에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시됩니다(포그라운드의 액티비티가 부분적으로 투명하거나 전체 화면을 뒤덮지 않습니다).

3. 정지됨(Stopped)

프래그먼트가 보이지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트도 여전히 표시는 됩니다(모든 상태 및 멤버 정보를 시스템이 보존합니다). 하지만 사용자에게는 더 이상 표시되지 않으며 액티비티를 종료하면 이것도 종료됩니다.

액티비티와 마찬가지로 onSaveInstanceState(Bundle), ViewModel 및 영구 로컬 저장소를 결합하여 구성이 변경되고 프로세스가 종료되더라도 프래그먼트의 UI 상태를 보존할 수 있습니다.

액티비티와 프래그먼트의 수명 주기에서 가장 중대한 차이점은 해당되는 백 스택에 저장되는 방법에 있습니다. 기본적으로 액티비티는 정지되면 시스템에서 관리하는 액티비티의 백 스택에 들어갑니다(작업 및 백 스택에서 설명하였듯이 사용자는 Back 버튼을 눌러서 액티비티로 돌아갈 수 있습니다). 하지만 프래그먼트는 이를 제거하는 트랜잭션에서 addToBackStack()을 호출하여 인스턴스를 저장하라고 명시적으로 요청할 경우에만 호스트 액티비티에서 관리하는 백 스택으로 들어갑니다.

5. 액티비티 수명 주기와의 조화

프래그먼트가 있는 액티비티의 수명 주기는 해당 프래그먼트의 수명 주기에 직접적인 영향을 미칩니다. 따라서 액티비티에 대한 각 수명 주기 콜백이 각 프래그먼트에 대한 비슷한 콜백을 발생시킵니다. 예를 들어 액티비티가 onPause()를 받으면, 해당 액티비티 내의 각 프래그먼트가 onPause()를 받습니다.

하지만 프래그먼트에는 프래그먼트의 UI를 빌드하고 소멸시키는 등의 같은 작업을 수행하기 위해 액티비티와의 고유한 상호작용을 처리하는 몇 가지 수명 주기 콜백이 더 있습니다. 이러한 추가 콜백 메서드는 다음과 같습니다.

1. onAttach()
프래그먼트가 액티비티와 연결되어 있었던 경우 호출됩니다(여기에서 Activity가 전달됩니다).

2. onCreateView()
프래그먼트와 연결된 뷰 계층을 생성하기 위해 호출됩니다.

3. onActivityCreated()

액티비티의 onCreate() 메서드가 반환할 때 호출됩니다.

4. onDestroyView()

프래그먼트와 연결된 뷰 계층이 제거되는 중일 때 호출됩니다.

5. onDetach()

프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출됩니다.
호스트 액티비티의 영향을 받는 동안 프래그먼트 수명 주기의 흐름은 그림 3과 같습니다. 이 그림은 액티비티의 각 연속된 상태에 따라 프래그먼트가 어떤 콜백 메서드를 수신할지 결정된다는 것을 보여줍니다. 예를 들어 액티비티가 자신의 onCreate() 콜백을 받은 경우, 해당 액티비티 안에 있는 프래그먼트는 onActivityCreated() 콜백을 받을 뿐입니다.

액티비티가 재개된 상태에 도달하면 자유자재로 프래그먼트를 액티비티에 추가하거나 액티비티에서 제거해도 됩니다. 따라서 액티비티가 재개된 상태에 있는 동안에만 프래그먼트의 수명 주기를 독립적으로 변경할 수 있습니다.

그러나 액티비티가 재개된 상태를 떠나면 액티비티는 다시 프래그먼트를 그 수명 주기 안으로 넣습니다.

6. reference

https://developer.android.com/guide/components/fragments?hl=ko
https://dongsik93.github.io/til/2021/10/01/til-android-fragment-lifecycle/

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글