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