
Fragment Lifecycle
Fragment는 Activity 내에서 관리하며 자체적인 Lifecycle이 존재합니다.
Lifecycle의 상태는 Enum Class를 상속받은 Lifecycle.State에 정의된 열거형 값을 가지고 있습니다.
INITIALIZED, CREATED, STARTED, RESUMED, DESTROYED
열거형 값들은 View Lifecycle, 어떤 상태에 있는지를 나타내며
LifecycleOwner에 의해 특정 생명 주기 객체의 현재 상태를 나타냅니다.
이 열거형 값은 Lifecycle 클래스에 속해 있음.
Fragment Class
Lifecycle 의 각 변경에 대응하는 콜백 메서드가 포함, 동시에 LifecycleOwner 인터페이스를 구현
Fragment Callbacks
Fragment CREATED STATE
onCreate(), onCreateView(), onViewCreated(), onViewStateRestored()
onAttach()
Fragment가 처음 컨텍스트에 연결 될 때 onCreate()보다 먼저 호출
public void onAttach(@NonNull Context context)
public void onAttach(@NonNull Activity activity) //deprecated
onCreate()
Fragment의 초기 생성 및 초기화를 하기 위해 호출
변수 초기화, 뷰 생성 및 레이아웃 인플레이션 등을 포함
savedInstanceState에서 이전에 저장한 데이터를 복원하는 등의 작업을 수행
Parameters
@Nullable Bundle savedInstanceState
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
class TestFragment : Fragment() {
private var counter: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. 변수 초기화
val defaultCounterValue = 0
// 2. savedInstanceState에서 이전에 저장한 데이터 복원
savedInstanceState?.let {
// 이전에 저장한 데이터가 있는 경우 복원
counter = it.getInt("counter", defaultCounterValue)
} ?: {
// 이전에 저장한 데이터가 없는 경우 기본값 사용
counter = defaultCounterValue
}
}
}
onCreateView()
프래그먼트의 UI를 그리는 데 사용되며, 프래그먼트의 뷰 계층을 만들기 위해 호출됩니다.
프래그먼트가 UI를 인스턴스화하도록 호출
class TestFragment : Fragment() {
// onCreateView에서 사용될 뷰를 나타내는 변수
private var fragmentView: View? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 1. 뷰를 인플레이트하기 위한 레이아웃 리소스 ID
val layoutResourceId = R.layout.test_fragment_layout
// 2. inflater를 사용하여 레이아웃을 인플레이트하여 View 생성
fragmentView = inflater.inflate(layoutResourceId, container, false)
// 3. 생성된 View 반환
return fragmentView
}
}
onViewCreated()
onCreateView()가 끝난 직후에 호출되며, 프래그먼트의 뷰가 생성 및 초기화된 후에 호출됩니다.
적합한 작업 : 뷰와 관련된 로직 수행
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val button = view.findViewById<Button>(R.id.btn_check)
button.setOnClickListener {
// 클릭 이벤트 처리
}
}
onViewStateRestored()
프래그먼트의 이전 상태가 복원될 때 호출됩니다.
뷰 계층 구조 자체를 추적하고 초기화 작업을 수행할 수 있습니다.
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
// EditText 내부 초기화
savedText = savedInstanceState?.getString("savedText", "") ?: ""
}
Fragment STARTED STATE
onStart()
Fragment가 사용자에게 표시될 때 호출
Activity의 라이프사이클과 연결 (Activity.onStart)
다른 생명주기 메서드들도 유사한 시점에 호출되고 같은 작업을 수행할 수 있기 때문에
onStart에서만 수행해야 하는 규칙은 없습니다
초기화 작업을 수행하기에 적절한 시점
(UI 업데이트)
Fragment RESUMED STATE
onResume() : 사용자와 상호 작용이 가능한 상태일 때 호출됩니다.
Fragment가 다시 활성화될 때 특정 기능을 사용하기 위한 권한이 있는지 체크하고
필요한 경우 권한을 요청할 때 활용
Fragment STARTED STATE
onPause(): 다른 액티비티나 프래그먼트로 인해 가려질 때 호출되며
현재 상태를 저장하거나 네트워크 호출 등을 정리하는 데 사용됩니다.
사용자는 해당 Fragment를 떠났거나, 일부를 가렸지만
라이프사이클이 다시 STARTED 상태로 이동되어 ON_PAUSE 이벤트를 내보냅니다.
벗어나기 전 상태(데이터)를 저장하거나, 네트워크 호출 종료
Fragment CREATED STATE
onStop(), onSaveInstanceState(), onDestroyView()
onStop(): 프래그먼트가 더 이상 사용자에게 표시되지 않을 때 호출됩니다.
뷰의 생명주기도 CREATED 상태로 전환
사용자가 다른 화면으로 전환하거나, 상위 Activity 중지되거나, 상위 Fragment가 중지될 때 발생할 수 있습니다.
API 수준에 따라서 onStop() 콜백과 onSaveInstanceState() 메서드의 호출 순서가 달라집니다.
적절한 작업 : 애니메이션 중지 (메모 소비가 큰 작업)
onSaveInstanceState()
프래그먼트의 현재 상태를 저장해야 할 때 호출되며
화면 회전 등의 구성 변경 시에 사용됩니다.
나중에 프로세스가 다시 시작되면 새 인스턴스로 재구성할 수 있습니다.
새 인스턴스를 생성해야 하는 경우 여기 번들에 있는 데이터
- onCreate, onCreateView 및 ViewCreate에 주어진 번들에서 사용할 수 있습니다.
onDestroyView()
프래그먼트의 뷰 계층이 제거되기 전에 호출됩니다.
onCreateView에서 만든 뷰가 fragment에서 분리되었을 때 호출됩니다.
다음에 Fragment를 표시해야 할 때 새 뷰가 생성됩니다.
Fragment CREATED STATE
onDestroy()
프래그먼트가 소멸될 때 호출되며, 사용한 리소스를 정리하거나 백그라운드 작업을 중지하는 데 사용됩니다.
ViewBinding을 Fragment에서 사용
_binding이라는 변수를 따로 관리하는 이유는
메모리 누수(memory leak)를 방지하고 안전한 View 참조를 보장하기 위함입니다.
참조하고 있는 동안 Fragment의 수명 주기가 View의 수명 주기보다 길기 때문에
_binding을 onDestroyView() 메서드에서 null로 설정함으로써
ViewBinding 클래스의 인스턴스가 뷰를 가지고 있는 동안만 참조되도록 합니다.
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
따라서, 프래그먼트의 생명 주기 동안에만 뷰를 참조하고 필요 없어지면 해제함으로써
안전하게 메모리를 관리할 수 있습니다.
'Android-Kotlin📱' 카테고리의 다른 글
팀 프로젝트 규칙 (0) | 2023.12.11 |
---|---|
[Android] Room (Entitiy, DAO, Database) (0) | 2022.07.09 |
[안드로이드] 액티비티 라이프 사이클 Activity Life Cycle (0) | 2022.06.29 |
[Android] 안드로이드 4대 컴포넌트 (Activity, Service, BroadCast Receiver, Content Provider) (0) | 2022.06.19 |
[Android] Constraint Layout Guideline (컨스트레인트 레이아웃 가이드라인) (0) | 2022.06.07 |