일반적인 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 함수를 사용하면 된다.