Android Lifecycle #1
Lifecycle
은 Activity나 Fragment와 같은 구성요소의 수명 주기 상태와 관련된 정보를 포함하며, 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스입니다.
Lifecycle
은 두 가지 enum을 사용하여 연결된 구성요소의 수명 주기 상태를 추적합니다.
- Event
프레임워크 및 Lifecycle 클래스에서 전달되는 수명 주기 이벤트입니다. 아래 이미지에서 화살표에 대응됩니다. 이러한 이벤트는 Activity와 Fragment의 Lifecycle 콜백 이벤트에 매핑됩니다. - State
Lifecycle 객체가 추적한 구성요소의 현재 상태입니다.
실제로 코드를 찾아보면 아래와 같이 되어있습니다.
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
를 멤버로 가지고 있습니다.