[Android] Jetpack - Lifecycle - 1

반응형

이전 Android 포스팅에서는 Jetpack의 Data Binding 컴포넌트에 대해 살펴보았습니다.

이번에는 Jetpack에서 Lifecycle을 제어하는 Component에 대해 알아보려고 합니다.

Architecure 부분에 포함되어있는 Lifecycle

 

Life-Aware Component라고 부르며, Activity나 Fragment와 같이 Component의 변화를 감지하여 해당 변화에 작업을 수행할 수 있게 해줍니다. Lifecycle은 짧은 코드 작성으로 유지보수에 적합하다고 합니다.

 

기존 Activity와 Fragment에서 사용할 수 있는 메소드 들은 해당 Component에 종속되어 사용해야 하기 때문에, 유연하지 못했지만, Lifecycle은 Activity와 Fragment와는 독립적으로 사용할 수 있습니다.

 

현재 Android Framework에 정의된 대부분의 앱 Component들에 Lifecycle이 사용되고 있습니다.

Lifecycle은 프로세스의 OS나 Framework 코드에 의해 관리되고 있습니다.

이것은 작동 방식의 핵심이며, Memory leak이나 App Crash등을 예방할 수 있습니다.


예시) 위치 추적 화면 코드 예시

internal class MyLocationListener(
        private val context: Context,
        private val callback: (Location) -> Unit
) {

    fun start() {
        // 시스템의 Location Service 연결
    }

    fun stop() {
        // 시스템의 Location Service 연결 끊기
    }
}

class MyActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener

    override fun onCreate(...) {
        myLocationListener = MyLocationListener(this) { location ->
            // UI 업데이트
        }
    }

    public override fun onStart() {
        super.onStart()
        myLocationListener.start()
        // activity lifecycle에 응답하는 다른 Component 관리
    }

    public override fun onStop() {
        super.onStop()
        myLocationListener.stop()
        // activity lifecycle에 응답하는 다른 Component 관리
    }
}

위의 예시 코드들은 수명주기 상태에 따라 UI를 관리하기 위한 많은 호출이 이루어지고 있습니다.

(onStart(), onStop()). 그렇기에 유지보수에 어려움이 있을 것으로 보이네요.

 

추가로, UI(Activity, Fragment 등) 가 멈추기 전에 위치 관련 Component에 대한 보장을 하기 어렵습니다. 특히, 오래 걸리는 작업에 대해서 말이죠.

결국, onStop()이 onStart() 보다 먼저 호출될 수도 있는 상황이 될 수도 있습니다. (race condition)

 

 

경쟁 상태 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 논리 상태에서의 경쟁 상태 공학 분야에서 경쟁 상태(race condition)란 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말

ko.wikipedia.org

 

이러한 문제점들을 해결할 수 있게 하는 것이 androidx.lifecycle package에서 제공합니다.

Lifecycle

Lifecycle는 Activity나 Fragment와 같은 Component의 Lifecycle 상태에 대한 정보를 가지고 있고, 다른 객체에서 상태를 관찰하게 할 수 있게 하는 클래스입니다.

Lifecycle은 두 가지로 나뉠수 있습니다.

 

Event

Framework와 Lifecycle 클래스에서 전달되는 Lifecycle event. 이러한 이벤트 들은 Acitivity나 Fragment에 callback event와 매칭됩니다.

 

State

Lifecycle 객체에 의해 변화가 있는 상태.

Android Activity Lifecycle에 구성되는 State와 Event

Component의 Lifecycle 상태는 DefaultLifecycleObserver를 구현하고, onCreate(), onStart()와 같은 메서드를 재정의 합니다. 

추가로, 아래와 같이 addObserver()를 호출하여 Observer를 추가, 전달합니다.

class MyObserver : DefaultLifecycleObserver {
    override fun onResume(owner: LifecycleOwner) {
        connect()
    }

    override fun onPause(owner: LifecycleOwner) {
        disconnect()
    }
}

myLifecycleOwner.getLifecycle().addObserver(MyObserver())


이어서 다음 포스팅에 마저 작성하겠습니다.

반응형

'DEV > Android' 카테고리의 다른 글

[Android] Jetpack - LiveData - 1  (0) 2023.03.27
[Android] Jetpack - Lifecycle - 2  (0) 2023.03.21
[Android] Jetpack - Data Binding - 3  (0) 2023.03.15
[Android] Jetpack - Data Binding - 2  (0) 2023.03.14
[Android] Jetpack - Data Binding - 1  (0) 2023.03.11