저번 포스팅에 이어 Jetpack에 대한 Lifecycle에 대해 정리해보려고 합니다.
[Android] Jetpack - Lifecycle - 1
이전 Android 포스팅에서는 Jetpack의 Data Binding 컴포넌트에 대해 살펴보았습니다. 이번에는 Jetpack에서 Lifecycle을 제어하는 Component에 대해 알아보려고 합니다. Life-Aware Component라고 부르며, Activity나 Fr
weirddev.tistory.com
LifecycleOwner
Lifecycle 컴포넌트를 가지고 있는 Interface. getLifecycle() 메소드를 구현해야 합니다.
즉, 개별 클래스에 Lifecycle의 소유권을 추상화합니다.
* 앱 프로세스의 Lifecycle을 관리하려면, ProcessLifecycleOwner를 참고해야합니다.
예시) Lifecycle 선언하여 UI 수명주기 인식
internal class MyLocationListener(
private val context: Context,
private val lifecycle: Lifecycle,
private val callback: (Location) -> Unit
): DefaultLifecycleObserver {
private var enabled = false
override fun onStart(owner: LifecycleOwner) {
if (enabled) {
// connect
}
}
fun enable() {
enabled = true
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
// connect if not connected
}
}
override fun onStop(owner: LifecycleOwner) {
// disconnect if connected
}
}
다른 Activity, Fragment에서 위의 클래스를 사용하고 싶다면, 초기화만 하면 됩니다.
관련 모든 작업들이 이 클래스에서 관리되게 됩니다.
일반적으로, Lifecycle이 특정 Callback을 전달하기 어려운 상황을 피할 수 있습니다.
예를 들어서, Activity 상태가 저장된 이후에 fragment의 transaction을 수행하면 서로 충돌이 일어날 수 있지만, Lifecycle을 사용하면 다른 객체에서 현재 Lifecycle 상태를 알 수 있기 때문에 해당 문제점을 피할 수 있습니다.
예시) DefaultLifecycleObserver를 활용하여 독립적으로 Lifecycle 상태를 확인
internal class MyLocationListener(
private val context: Context,
private val lifecycle: Lifecycle,
private val callback: (Location) -> Unit
): DefaultLifecycleObserver {
private var enabled = false
override fun onStart(owner: LifecycleOwner) {
if (enabled) {
// connect
}
}
fun enable() {
enabled = true
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {
// connect if not connected
}
}
override fun onStop(owner: LifecycleOwner) {
// disconnect if connected
}
}
custome LifecycleOwner 구현
Lifecycle을 사용하는 class를 구현하기 위해선, LifecycleRegistry를 사용하여 Event를 전달해야합니다.
class MyActivity : Activity(), LifecycleOwner {
private lateinit var lifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleRegistry = LifecycleRegistry(this)
lifecycleRegistry.markState(Lifecycle.State.CREATED)
}
public override fun onStart() {
super.onStart()
lifecycleRegistry.markState(Lifecycle.State.STARTED)
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
'DEV > Android' 카테고리의 다른 글
[Android] Jetpack - LiveData - 2 (4) | 2023.03.29 |
---|---|
[Android] Jetpack - LiveData - 1 (0) | 2023.03.27 |
[Android] Jetpack - Lifecycle - 1 (0) | 2023.03.21 |
[Android] Jetpack - Data Binding - 3 (0) | 2023.03.15 |
[Android] Jetpack - Data Binding - 2 (0) | 2023.03.14 |