Android Lifecycle #1

choi jeong heon
슬기로운 개발생활
4 min readOct 9, 2021

Lifecycle 은 Activity나 Fragment와 같은 구성요소의 수명 주기 상태와 관련된 정보를 포함하며, 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스입니다.

Lifecycle두 가지 enum을 사용하여 연결된 구성요소의 수명 주기 상태를 추적합니다.

  1. Event
    프레임워크 및 Lifecycle 클래스에서 전달되는 수명 주기 이벤트입니다. 아래 이미지에서 화살표에 대응됩니다. 이러한 이벤트는 Activity와 Fragment의 Lifecycle 콜백 이벤트에 매핑됩니다.
  2. State
    Lifecycle 객체가 추적한 구성요소의 현재 상태입니다.
https://developer.android.com/topic/libraries/architecture/lifecycle?hl=ko

실제로 코드를 찾아보면 아래와 같이 되어있습니다.

addObserver(), removeObserver() 메서드가 있는 것으로 보아 Observer 패턴 을 이용하고 있다는 것을 짐작할 수 있습니다.

LifecycleObserver

LifecycleObserver 메서드에 annotation을 추가하여 구성요소의 수명 주기 상태를 모니터링할 수 있습니다. (see MyObserver class)
그런 후, Lifecycle 클래스의 addObserver() 메서드를 호출하고 관찰자의 인스턴스를 전달하여 관찰자를 추가할 수 있습니다.

실제로 LifecycleObserver 코드를 확인하면 비어있는데, OnLifecycleEvent라는 annotated methods에 의존한다고 되어있습니다. 제대로 이해하려면 annotation에 대한 이해가 필요할 것 같습니다.

LifecycleOwner

LifecycleOwner는 클래스에 Lifecycle이 있음을 나타내는 단일 메서드 인터페이스입니다.

이 인터페이스에는 클래스에서 구현해야 하는 getLifecycle() 메서드가 하나 있습니다.

소유자가 수명 주기를 관찰자에게 제공할 수 있으므로, LifecycleObserver를 구현하는 구성요소는 LifecycleOwner를 구현하는 구성요소와 원활하게 작동합니다.

LifecycleRegistry

위에서 보았던 Lifecycle 클래스는 abstract 클래스였습니다. Lifecycle의 구현체가 바로 LifecycleRegistry 입니다. 이 클래스에서는 등록된 여러 LifecycleObserver를 handle할 수 있습니다.

Lifecycle 을 handle 하는 메서드와 옵저버를 등록하는 메서드 등등을 제공합니다.

아래와 같이 커스텀 LifecycleOwner를 구현할 수 있는데,

Lifecycle의 상태를 바꾸고, 변경된 것을 Observer들에게 알리는 역할을 Activity가 LifecycleRegistry에게 위임한 형태라고 볼 수 있습니다.

setCurrentState 으로 Lifecycle의 상태를 바꿀때, 상태 변화를 LifecycleObserver에서 수신할 수 있게 됩니다.

실제로는 어떻게 되어있을까요?
우리는 보통 AppCompatActivity를 상속한 Activity를 사용합니다.
상속 관계를 계속 따라 올라가다 보면, ComponentActivity 가 나오는데 바로 이 녀석이 LifecycleOwner 를 구현한 구현체이며, 위의 예제 처럼 LifecycleRegistry 를 멤버로 가지고 있습니다.

--

--