attached to post

# Lifecycle Event 옵저빙하기 Compose에서 Activity Lifecycle을 옵져빙할때 어떻게 하셨나요? 기존에는 따로 제공되지 않아서 직접 구현했었는데요, 이번 2024년 1월 10일에androidx.lifecycle:lifecycle-*:2.7.0” 라이브러리에 관련 기능이 추가되었다고 합니다. ## LifecycleEventEffect, LifecycleStartEffect, LifecycleResumeEffect ### LifecycleEventEffect https://android-review.googlesource.com/c/platform/frameworks/support/+/2813103/2/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/LifecycleEffect.kt#55 ```kotlin LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { // do something } ``` 위에 코드와 같이 이벤트를 발생시키고 싶은 Lifecycle을 등록하여서 사용할 수 있습니다. 라이브러리 소스코드를 보면 “ON_DESTROY”를 등록하면 Compose가 이미 dispose가 되었기 때문에 IllegalArgumentException을 던지게 됩니다. ### LifecycleStartEffect https://android-review.googlesource.com/c/platform/frameworks/support/+/2813103/2/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/LifecycleEffect.kt#322 ```kotlin LifecycleStartEffect(lifecycleOwner) { // add ON_START effect here onStopOrDispose { // add clean up for work kicked off in the ON_START effect here } } ``` DisposableEffect와 유사한 형태를 가지고 있으며, “onStart”일 경우 안에 “LifecycleStartEffect” 블록안에 선언된 코드가 실행되며, “onStop”인 경우 “onStopOrDispose”가 호출되는 구조입니다. ### **LifecycleResumeEffect** https://android-review.googlesource.com/c/platform/frameworks/support/+/2813103/2/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/LifecycleEffect.kt#646 ```kotlin LifecycleResumeEffect(lifecycleOwner) { // add ON_RESUME effect here onPauseOrDispose { // add clean up for work kicked off in the ON_RESUME effect here } } ``` LifecycleStartEffect 와 기능이 유사하며, 블록 내부에서는 “onResume”일 경우 실행이 되고 “onPauseOrDispose”는 onPause인 경우 실행하게 됩니다. ## LifecycleStartEffect 자세히 살펴보기 https://android-review.googlesource.com/c/platform/frameworks/support/+/2813103/2/lifecycle/lifecycle-runtime-compose/src/main/java/androidx/lifecycle/compose/LifecycleEffect.kt#322 개인적으로 흥미롭게 본 코드였으며, 내부적으로 어떻게 구현되어 있는지 확인해봤습니다. 내부 구조는 아래와 같습니다. 1. “LifecycleStartEffect”를 구현한 “LifecycleStartEffectImpl”가 있습니다. 2. 변수 scope : recomposition을 발동시킬 key를 사용하여 LifecycleStartStopEffectScope를 remeber를 시켜 줍니다. 3. 변수 currentEffects : “LifecycleStartStopEffectScope”로 리시버를 가진 파라미터를 람다 블록 내부에서 업데이트된 값을 받을 수 있게 “rememberUpdatedState()”로 감싸줍니다. (LifecycleStartStopEffectScope.() -> LifecycleStopOrDisposeEffectResult) 4. 2번과 3번의 값을 “LifecycleStartEffectImpl”로 넘겨줍니다. 5. “LifecycleStartEffectImpl” 내부적으로 “DisposableEffect” 내부에 “LifecycleEventObserver”을 통해서 lifecycle을 observing 합니다. 6. “onStart”인 경우 2번의scope”를 3번 “currentEffects” 를 사용하여 실행시켜줍니다. 결과물로 ”LifecycleStopOrDisposeEffectResult”가 반환되게 됩니다. 7. 6번의 결과물을 "effectResult”라는 변수에 저장해줍니다. 8. 만약에 “onStop”이 되었으면 effectResult가 null이 아닌 경우 6번의LifecycleStopOrDisposeEffectResult”인터페이스에 선언된 “runStopOrDisposeEffect”을 실행시킵니다. 9. 실제로 사용하는 측은 “onStop”이 되었을 경우 “onStopOrDispose” 블록 내부가 실행하게 됩니다. 10. onDispose인 경우도 lifecycle observing을 해제한 후 effectResult가 null이 아닌 경우 “runStopOrDisposeEffect”을 실행시킵니다. ## 참고 - https://www.linkedin.com/posts/skydoves_android-kotlin-compose-activity-7151773864367149056-J5xn?utm_source=share&utm_medium=member_desktop - https://developer.android.com/reference/kotlin/androidx/lifecycle/compose/package-summary#LifecycleEventEffect(androidx.lifecycle.Lifecycle.Event,androidx.lifecycle.LifecycleOwner,kotlin.Function0)

댓글 1