Fragment - 5. Fragment 수명 주기 처리+
프래그먼트 수명 주기 처리

그림 3. 액티비티 수명 주기가 프래그먼트 수명 주기에 미치는 영향.
프래그먼트의 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 매우 비슷합니다. 액티비티와 마찬가지로 프래그먼트는 세 가지 상태로 존재할 수 있습니다.
- 재개됨(Resumed)
- 프래그먼트가 실행 중인 액티비티에 표시됩니다.
- 일시정지됨(Paused)
- 또 다른 액티비티가 포그라운드에 있고 포커스를 갖고 있지만, 이 프래그먼트가 있는 액티비티도 여전히 표시됩니다(포그라운드의 액티비티가 부분적으로 투명하거나 전체 화면을 뒤덮지 않습니다).
- 정지됨(Stopped)
- 프래그먼트가 표시되지 않습니다. 호스트 액티비티가 정지되었거나 프래그먼트가 액티비티에서 제거되었지만 백 스택에 추가되었습니다. 정지된 프래그먼트도 여전히 표시는 됩니다(모든 상태 및 멤버 정보를 시스템이 보존합니다). 하지만, 사용자에게는 더 이상 표시되지 않으며 액티비티를 종료하면 이것도 종료됩니다.
이번에도 액티비티와 마찬가지로, 프래그먼트의 상태를 보존하려면 Bundle
을 사용합니다. 이는 혹시나 액티비티의 프로세스가 종료되고 액티비티를 다시 만들 때 해당 프래그먼트의 상태를 복구해야 할 필요가 있을 때를 대비하는 것입니다. 프래그먼트의 onSaveInstanceState()
콜백 중에 상태를 저장할 수 있고, onCreate()
, onCreateView()
또는 onActivityCreated()
중에 상태를 복구할 수 있습니다. 상태 저장에 관한 자세한 정보는 액티비티 문서를 참조하세요.
액티비티와 프래그먼트의 수명 주기에서 가장 중대한 차이점은 해당되는 백 스택에 저장되는 방법입니다. 액티비티는 기본적으로 중단되었을 때 시스템이 관리하는 액티비티 백 스택 안에 배치됩니다. (따라서 사용자가 Back 버튼을 사용하여 다시 이 액티비티로 돌아갈 수 있습니다. 이 내용은 작업 및 백 스택에서 설명하였습니다.) 하지만, 프래그먼트가 호스트 액티비티가 관리하는 백 스택 안에 배치되는 경우는 트랜잭션 동안 프래그먼트를 제거하는 addToBackStack()
을 호출하여 해당 인스턴스를 저장하라고 명시적으로 요청하는 경우뿐입니다.
이것만 제외하면, 프래그먼트 수명 주기를 관리하는 것은 액티비티의 수명 주기를 관리하는 것과 아주 비슷합니다. 따라서, 액티비티 수명 주기 관리에 쓰이는 사례가 프래그먼트에도 똑같이 적용됩니다. 하지만 또 한 가지 이해해두어야 하는 것이 있습니다. 즉, 액티비티의 수명이 프래그먼트의 수명에 어떤 영향을 미치는지를 알아두어야 합니다.
주의: Fragment
내에서 Context
객체가 필요한 경우, getActivity()
를 호출하면 됩니다. 그러나 getActivity()
를 호출하는 것은 프래그먼트가 액티비티에 첨부되어 있는 경우뿐이니 유의하세요. 프래그먼트가 아직 첨부되지 않았거나 수명 주기가 끝날 무렵 분리된 경우, getActivity()
가 null을 반환합니다.
액티비티 수명 주기와의 조화
프래그먼트가 있는 액티비티의 수명 주기는 해당 프래그먼트의 수명 주기에 직접적인 영향을 미칩니다. 따라서 액티비티에 대한 각 수명 주기 콜백이 각 프래그먼트에 대한 비슷한 콜백을 유발합니다. 예를 들어 액티비티가 onPause()
를 받으면, 해당 액티비티 내의 각 프래그먼트가 onPause()
를 받습니다.
하지만, 프래그먼트에는 프래그먼트의 UI를 구축하고 소멸시키는 것과 같은 작업을 하기 위해 액티비티와의 고유한 상호작용을 처리하는 몇 가지 수명 주기 콜백이 더 있습니다. 이러한 추가 콜백 메서드에는 다음과 같은 것들이 있습니다.
onAttach()
- 프래그먼트가 액티비티와 연관되어 있었던 경우 호출됩니다(여기에서
Activity
가 전달됩니다). onCreateView()
- 프래그먼트와 연관된 뷰 계층을 생성하기 위해 호출됩니다.
onActivityCreated()
- 액티비티의
onCreate()
메서드가 반환되면 호출됩니다. onDestroyView()
- 프래그먼트와 연관된 뷰 계층이 제거되는 중일 때 호출됩니다.
onDetach()
- 프래그먼트가 액티비티와 연결이 끊어지는 중일 때 호출됩니다.
호스트 액티비티의 영향을 받는 동안 프래그먼트 수명 주기의 흐름이 그림 3에 나타나 있습니다. 이 그림에서는 프래그먼트가 어떤 콜백 메서드를 수신할지 여부는 액티비티의 각 연속된 상태에 따라 결정된다는 것을 보여줍니다. 예를 들어 액티비티가 자신의 onCreate()
콜백을 받은 경우, 해당 액티비티 안에 있는 프래그먼트는 onActivityCreated()
콜백을 받을 뿐입니다.
액티비티가 재개된 상태에 도달하면 자유자재로 프래그먼트를 액티비티에 추가하거나 액티비티에서 제거해도 됩니다. 따라서, 액티비티가 재개된 상태에 있는 동안에만 프래그먼트의 수명 주기를 독립적으로 변경할 수 있습니다.
그러나 액티비티가 재개된 상태를 떠나면 액티비티는 다시 프래그먼트를 그 수명 주기 안으로 넣습니다.