[Android] LifecycleOwnerWrapper 분석

앱이 포그라운드에서 백그라운드로 전환됐을 때 해당 Activity가 onPause에서 onStop으로 전환된다. 이때 ViewModel의 LiveData가 변경을 감지하고자 등록된 (Activity 또는 Fragment로부터 받은) lifecycleOwner는 활성화(active) 상태에서 비활성화(inActive) 상태로 전환된다.

이때 onStop(inActive 상태) 시에도 활성화 상태를 유지하기 위해 구현된 LifecycleOwnerWrapper 상세는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class LifecycleOwnerWrapper(
sourceOwner: LifecycleOwner
): LifecycleOwner, LifecycleEventObserver {

override val lifecycle = LifecycleRegistry(this)

init {
sourceOwner.lifecycle.addObserver(this)

when (val state = sourceOwner.lifecycle.currentState) {
Lifecycle.State.DESTROYED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
Lifecycle.State.CREATED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
Lifecycle.State.STARTED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
Lifecycle.State.RESUMED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
else -> {
// do nothing, the observer will catch up
}
}
}

override fun onStateChanged(
source: LifecycleOwner,
event: Lifecycle.Event
) {
if (event != Lifecycle.Event.ON_PAUSE
&& event != Lifecycle.Event.ON_STOP) {
lifecycle.handleLifecycleEvent(event)
}
}
}

  1. “onStop(inactive 상태) 시에도 활성화 상태를 유지하”는 lifecycle을 새롭게 만들기 위해 LifecycleOwner를 상속받아 lifecycle 변수를 새로 정의한다.

    1
    2
    3
    4
    class LifecycleOwnerWrapper(sourceOwner: LifecycleOwner): LifecycleOwner, LifecycleEventObserver {
    override val lifecycle = LifecycleRegistry(this)
    ...
    }
  2. 그 lifecycle이 생성되었을 때 현재 state를 init을 통해 등록한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    init {
    ...
    when (val state = sourceOwner.lifecycle.currentState) {
    Lifecycle.State.DESTROYED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    Lifecycle.State.CREATED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
    Lifecycle.State.STARTED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START)
    Lifecycle.State.RESUMED -> lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
    else -> {}
    }
    }

    여기서 handleLifecycleEvent는 아래 구현부와 같이 파라미터로 받은 state를 currentState로 등록하는 역할을 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /**
    * Sets the current state and notifies the observers.
    */
    open fun handleLifecycleEvent(event: Event) {
    enforceMainThreadIfNeeded("handleLifecycleEvent")
    moveToState(event.targetState)
    }

    private fun moveToState(next: State) {
    if (state == next) {
    return
    }
    check(!(state == State.INITIALIZED && next == State.DESTROYED)) {
    "no event down from $state in component ${lifecycleOwner.get()}"
    }
    state = next
    if (handlingEvent || addingObserverCounter != 0) {
    newEventOccurred = true
    // we will figure out what to do on upper level.
    return
    }
    handlingEvent = true
    sync()
    handlingEvent = false
    if (state == State.DESTROYED) {
    observerMap = FastSafeIterableMap()
    }
    }
  3. 새로운 lifecycle에 대한 동작을 구현하기 위해 LifecycleEventObserver를 상속받도록 하여 onStateChanged를 구현할 수 있도록 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class LifecycleOwnerWrapper(
    sourceOwner: LifecycleOwner
    ): LifecycleOwner, LifecycleEventObserver {
    ...
    override fun onStateChanged(
    source: LifecycleOwner,
    event: Lifecycle.Event
    ) {}
    }
    • 여기서 LifecycleEventObserver를 상속받지 않고 LifecycleOwnerWrapper를 사용하는 Activity 또는 Fragment 내의 observer를 등록하는 부분에서 LifecycleEventObserver를 구현해도 된다.
  4. onStateChanged에는 “onStop(inactive 상태) 시에도 활성화 상태를 유지하”기 위해 onStop일 경우 정상적으로 handleLifecycleEvent를 호출하지 않도록 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    override fun onStateChanged(
    source: LifecycleOwner,
    event: Lifecycle.Event
    ) {
    if (event != Lifecycle.Event.ON_PAUSE
    && event != Lifecycle.Event.ON_STOP) {
    lifecycle.handleLifecycleEvent(event)
    }
    }

    그럼으로써 이 lifecycle에서는 다음과 같은 커스텀 lifecycle이 적용된다.

    정상 lifecycle 활성화 여부 커스텀 lifecycle에서의 state 활성화 여부
    onCreate x ON_CREATE x
    onStart o ON_START o
    onResume o ON_RESUME o
    onPause o* ON_RESUME o
    onStop x ON_RESUME o
    onDestroy x ON_DESTROY x
    *링크에 따르면, Fragment에서는 onPause에서도 active하다고 함.
  5. 마지막으로 구현된 새로운 lifecycle을 적용하기 위해 sourceOwner에 LifecycleEventObserver를 등록(addObserver)한다.

    1
    sourceOwner.lifecycle.addObserver(this)

Author

LEEJS

Posted on

2025-01-08

Updated on

2026-01-10

Licensed under

댓글