[Android] Jetpack - Lifecycle - 2

반응형

저번 포스팅에 이어 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