Android

Lifecycle

까망사과 2022. 11. 11. 01:00

Lifecycle

Lifecycle은 액티비티, 프래그먼트 같은 컴포넌트의 수명 주기 상태 정보를 포함한다.

이를 사용하면 컴포넌트의 수명 주기에 따르는 로직을 분리할 수 있으므로 컴포넌트의 코드가 간결해진다.

해당 상태 정보는 다른 객체에서 관찰할 수 있다.

 

Lifecycle은 다음 두 enum을 사용하여 자신과 관련된 컴포넌트의 수명 주기 상태를 추적한다.

  • State
    Lifecycle이 추적하는 수명 주기 상태. 이 enum은 다음 값을 포함한다.
    • INITIALIZED
    • CREATED
    • STARTED
    • RESUMED
    • DESTROYED
  • Event
    프레임워크 및 Lifecycle에서 제공하는 수명 주기 이벤트. 이는 액티비티나 프래그먼트의 콜백 이벤트에 맵핑된다.
    enum은 다음 값을 포함한다.
    • ON_ANY
    • ON_CREATE
    • ON_START
    • ON_RESUME
    • ON_PAUSE
    • ON_STOP
    • ON_DESTROY

 

수명 주기를 구성하는 상태 및 이벤트

 

현재 수명 주기 상태 확인하기

Lifecycle 객체의 getCurrentState()를 호출하면 현재 수명 주기 상태에 해당하는 State 값이 반환된다.

로직을 특정 수명 주기 상태 이후에 실행하고자 한다면 조건문에 State.isAtLeast(State)를 사용할 수 있다.

  • Lifecycle.State.isAtLeast(Lifecycle.State): Boolean
    현재 수명 주기 상태가 파라미터로 전달된 상태보다 이후 상태인지 비교한다.

 


LifecycleObserver

Lifecycle 객체를 관찰하려면 DefaultLifecycleObserver 인터페이스를 구현하여 각 수명 주기에 대응하는 메서드를 재정의해야 한다. 그리고 나서 해당 관찰하고자 하는 Lifecycle 객체의 addObserver(LifecycleObserver)에 관찰자 객체를 전달해야 한다. 반대로 관찰자를 등록 해제하려면 LifecycleremoveObserver(LifecycleObserver)에 관찰자 객체를 전달한다.

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

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

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

 

DefaultLifecycleObserver 인터페이스는 다음 6가지 메서드를 포함한다.

  • onCreate(LifecycleOwner)
    ON_CREATE 이벤트가 발생함을 알린다. LifecycleOwneronCreate()가 완료된 뒤 호출된다.
  • onStart(LifecycleOwner)
    ON_START 이벤트가 발생함을 알린다. LifecycleOwner onStart()가 완료된 뒤 호출된다.
  • onResume(LifecycleOwner)
    ON_RESUME 이벤트가 발생함을 알린다. LifecycleOwner onResume()가 완료된 뒤 호출된다.
  • onPause(LifecycleOwner)
    ON_PAUSE 이벤트가 발생함을 알린다. LifecycleOwner onPause()가 호출되기 전 호출된다.
  • onStop(LifecycleOwner)
    ON_STOP 이벤트가 발생함을 알린다. LifecycleOwner onStop()가 호출되기 전 호출된다.
  • onDestroy(LifecycleOwner)
    ON_DESTROY 이벤트가 발생함을 알린다. LifecycleOwner onDestroy()가 호출되기 전 호출된다.

 


LifecycleOwner

Lifecycle을 포함하는 인터페이스다. 단일 메서드인 getLifecycle()을 통해 포함하고 있는 Lifecycle에 액세스할 수 있다. FragmentFragmentActivityLifecycleOwner를 구현하는 클래스이므로 바로 Lifecycle을 참조할 수 있다.