Activity나 Fragment 같은 다른 컴포넌트의
Lifecycle
이 변경될 때 이에 대응하는 라이브러리.
Component
(안드로이드 component가 아닌 자신 만의 역할이 있는 코드 component)가lifecycleOwner
의 상태변화를observe
하여 필요한 작업을 스스로 하는 기능
왜 필요할까?
-> 일반적으로는 Activity나 Fragment의 생명 주기 메소드에 데이터를 불러오거나 리소스를 정리한다. 하지만 프로그램 규모가 커지면서 코드가 광범위해지고 잠재적인 에러 유발 요소가 된다.
그래서 생명 주기에 의존적이었던 코드를 걷어 내고 lifecycle-aware 컴포넌트
에 이에 대한 처리를 위임함으로써 유지보수성을 높인다.
component가 lifecycle
에 따른 작업을 소유할 수 있도록 하며, 이런 component를 Lifecycle aware
하다고 한다.
androidx.appcomapt:appcompat
을 이미 사용하고 있다면 Lifecycle-aware
컴포넌트들이 포함되어 별도의 작업이 필요없다.
androidx.lifecycle
패키지는 activity나 fragment의 생명 주기 상태에 따라 자동으로 동작을 조정할 수 있는 클래스와 인터페이스를 제공한다.
Activity나 Fragment 같은 컴포넌트의 생명 주기 상태에 대한 정보를 가지고 다른 객체가 이를 관찰할 수 있도록 돕는 클래스
Event와 State를 통해 연관된 컴포넌트들의 생명 주기 상태를 추적한다. 생명 주기에 변화가 생기면 등록된 Observer
를 실행해주는 역할을 한다.
2-1. Event
Framework
와 Lifecycle
클래스로부터 얻는 생명 주기 이벤트를 말한다. 이런 이벤트들은 activity와 fragment의 콜백 이벤트에 매핑된다. ON_ANY
,ON_CREATE
, ON_DESTROY
, ON_PAUSE
, ON_RESUME
, ON_START
, ON_STOP
2-2. State
Lifecycle
객체가 추적한 컴포넌트의 현재 상태를 뜻한다.State
는 그래프의 노드이고, Event
는 두 노드 사이를 이동하는 사건이라고 생각하자!!!!2-3. 구조
Lifecycle
객체에 Observer
를 등록해 놓으면 activity나 fragment의 생명주기 변경 시 Lifecycle
객체가 등록된 Observer
를 실행하는 구조.
클래스에
Lifecycle
이 있음을 나타내는 함수인getLifecycle()
메소드 하나만 가진 인터페이스
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
반환값이 되는 Lifecycle
은 abstract class
로 Lifecycle Observer
를 추가하고 제거하며 현재 state
를 확인할 수 있는 인터페이스를 제공한다.
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
public enum Event {
// ...
}
public enum State {
// ...
}
}
다시 말해 Lifecycle
의 소유권을 추상화하는 인터페이스로 Lifecycle
을 반환하는 getLifecycle()
메소드 하나만을 가진다.
AppCompatyActivity
나 Fragment
는 LifecycleOwner
가 이미 구현되어 있어 getLifeCycle()
메소드로 쉽게 Lifecycle
을 사용할 수 있다. 다른 클래스들은 LifecycleOwner
를 구현해야 한다.
사용자 정의 LifecycleOwner
를 구현하려면 LifecycleRegistry
를 사용하면 된다.
LifecycleRegistry
Lifecycle
의 구현체가 바로 LifecycleRegistry
인데 등록된 여러 Observer
를 handle할 수 있다. override
한 주요 메소드는 addObserver
, removeObserver
등 Observer 객체를 관리하기 위한 것과 Lifecycle
의 State
를 지정하거나 변경할 수 있는 메소드들이다.
class MyActivity : Activity(), LifecycleOwner {
private lateinit var lifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleRegistry = LifecycleRegistry(this)
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
public override fun onStart() {
super.onStart()
lifecycleRegistry.currentState = Lifecycle.State.STARTED
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
LifecycleObserver
인터페이스를 사용하면 되지만 해당 인터페이스를 직접 사용하지 않고 이를 구현하여 작성된 인터페이스인 DefaultLifeCycleObserver
나 LifecycleEventObserver
를 사용한다. 4-1. DefaultLifeCycleObserver
LifeCycleOwner
의 상태 변경을 관찰하는 콜백 인터페이스DefaultLifeCycleObserver
와 LifecycleEventObserver
를 모두 구현했다면 DefaultLifecycleObserver
의 메소드들이 먼저 호출되고 나서 LifecycleObserver.onStateChanged()
의 호출이 따라온다. 4-2. LifecycleEventObserver
receiver
에게 보낼 수 있는 클래스LifecycleEventObserver
의 메소드는 1개 존재하고 생명주기가 변할 때 Event
가 넘어오게 되고 해당 Event
를 분기해서 필요한 코드를 호출하는 구조이다.class MyLifeCycleObserver : DefaultLifecycleObserver, LifecycleEventObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
Log.d(owner.toString(), "onCreate")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
Log.d(owner.toString(), "onResume")
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> {
Log.d(source.toString(), "onCreateEvent")
}
Lifecycle.Event.ON_START -> {
Log.d(source.toString(), "onStartEvent")
}
else -> {}
}
}
}
//MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycle.addObserver(MyLifeCycleObserver())
// Observer를 activity에 연결하면 MainActivity의 생명 주기를
// MyLifecycleObserver 클래스에서 받을 수 있다.
// lifecycle은 개발자가 작성한 클래스가 아니므로 getLifecycle()메소드 이용
}
}