Android/Lifecycle

[Android] LifecycleEventObserver 사용해 Activity 생명주기에 대한 콜백 등록하기: onStart, onResume, onPause, onStop 등에 대한 콜백 등록하기

일반적인 Activity 생명주기에 대한 콜백 등록 방법

일반적으로 Activity 생명주기에 대한 콜백을 등록하기 위해서는 Activity 수준에서 onStart, onResume, onPause, onStop 등의 함수들을 override 하고 그 함수에 해당 콜백을 등록해야 한다.

class MainActivity : ComponentActivity() {
    ...

    override fun onStart() {
        super.onStart()
        println("onStart 콜백")
    }

    override fun onResume() {
        super.onResume()
        println("onResume 콜백") 
    }

    override fun onPause() {
        super.onPause()
        println("onPause 콜백")
    }

    override fun onStop() {
        super.onStop()
        println("onStop 콜백")
    }
}

 

하지만, 이 방법은 연관된 콜백에 대한 코드를 분산되게 만드는 문제가 있다. 예를 들어 앱이 백그라운드로 내려갔을 때, 앱의 상태를 기억하고 다시 포그라운드로 돌아왔을 때 복구해줘야 하는 동작이 있다고 했을 때 onResume와 onPause에 각각 콜백을 등록해줘야 한다.

이러한 경우를 위해 안드로이드는 LifecycleEventObserver 객체를 통해 연관된 콜백을 함께 작성할 수 있는 방법을 제공한다. 

 

 

LifecycleEventObserver 객체 사용해 Activity 생명주기에 대한 콜백 등록하기

LifecycleEventObserver 객체를 만드는 방법은 간단하다. LifecycleEventObserver은 onStateChanged 함수만 가지는 간단한 인터페이스로, Kotlin의 SAM(Single Abstract Method)을 사용해 간단하게 구현체를 만들 수 있다.

public fun interface LifecycleEventObserver : LifecycleObserver {
    /**
     * Called when a state transition event happens.
     *
     * @param source The source of the event
     * @param event The event
     */
    public fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event)
}

 

예를 들어 onPause 시 saveCurrentState를 동작을 하고, onResume 시 resumeCurrentState 동작을 하는  LifecycleEventObserver 객체는 다음과 같이 만들 수 있다.

val lifecycleEventObserver = LifecycleEventObserver { source, event ->
    when(event) {
        Lifecycle.Event.ON_PAUSE -> {
            saveCurrentState()
        }
        Lifecycle.Event.ON_RESUME -> {
            resumeCurrentState()
        }
        else -> {
            // ...
        }
    }
}

 

이렇게 LifecycleEventObserver을 만들었으면, Activity의 Lifecycle 객체에 LifecycleEventObserver 객체를 등록해줘야 한다. 이를 위해 Activity가 가진 Lifecycle 객체의 lifecycle.addObserver 함수를 사용하면 된다.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val lifecycleEventObserver = LifecycleEventObserver { source, event ->
            when(event) {
                Lifecycle.Event.ON_PAUSE -> {
                    saveCurrentState()
                }
                Lifecycle.Event.ON_RESUME -> {
                    resumeCurrentState()
                }
                else -> {
                    // ...
                }
            }
        }

        this.lifecycle.addObserver(lifecycleEventObserver)
        ...
    }
}

 

만약 특정한 조건을 만족했을 때 이 LifecycleEventObserver을 제거하고 싶다면 removeObserver 함수를 사용하면 된다.

this.lifecycle.removeObserver(lifecycleEventObserver)

 

 

정리

  • LifecycleEventObserver 객체를 사용해 Activity에 생명주기에 대한 콜백을 등록할 수 있다.
  • LifecycleEventObserver 객체를 등록할 때는 Lifecycle 객체의 addObserver 함수를 사용하면 되며, 제거할 때는 removeObserver 함수를 사용하면 된다.
반응형

 

이 글의 저작권은 Dev World 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com