앱이 백그라운드인지 포그라운드인지 체크하려면 어떻게 해야 될까요?
생명주기를 관찰하는 LifecycleObserver를 활용할 수 있습니다.
위 그림은 LifecycleObserver 개발자 문서 일부인데요
LifecycleObser를 바로 사용하지 말고,
확장된 인터페이스로 LifecycleEventObserver 또는 DefaultLifecycleObserver를 사용하시면 됩니다.
Application 클래스 생성
앱에 전반적인 생명주기를 관찰하기 위해 Application 클래스가 필요합니다.
생성한 Application 클래스 이름을 아래와 같이 manifests에 등록해 주세요.
<application
android:name=".MyApplication"
...
</application>
LifecycleEventObserver 사용
LifecycleEventObserver는 onStateChanged 메서드를 통해 생명주기 상태(Lifecycle.Event)가 변경될 때마다 호출되며, 해당 상태에 따라 백그라운드 및 포그라운드 상태를 체크할 수 있습니다.
class MyApplication: Application(), LifecycleEventObserver {
companion object {
private var TAG = "MyApplication"
var isBackground = false
}
override fun onCreate() {
super.onCreate()
// 생명 주기 관찰 등록
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> {
Log.d(TAG, "onStateChanged ON_CREATE")
}
Lifecycle.Event.ON_START -> {
Log.d(TAG, "onStateChanged ON_START")
}
Lifecycle.Event.ON_RESUME -> {
Log.d(TAG, "onStateChanged ON_RESUME")
// 포그라운드
isBackground = false
}
Lifecycle.Event.ON_PAUSE -> {
Log.d(TAG, "onStateChanged ON_PAUSE")
// 백그라운드
isBackground = true
}
Lifecycle.Event.ON_STOP -> {
Log.d(TAG, "onStateChanged ON_STOP")
}
Lifecycle.Event.ON_DESTROY -> {
Log.d(TAG, "onStateChanged ON_DESTROY")
// 생명 주기 관찰 해제
ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
}
Lifecycle.Event.ON_ANY -> {
Log.d(TAG, "onStateChanged ON_ANY")
}
}
}
}
DefaultLifecycleObserver 사용
DefaultLifecycleObserver는 생명주기 상태(Lifecycle.Event)에 따른 각각의 onCreate, onStart, onResume, onPause, onStop, onDestroy 메서드가 호출되기 때문에 백그라운드 및 포그라운드 상태를 체크할 수 있습니다.
class MyApplication: Application(), DefaultLifecycleObserver {
companion object {
private var TAG = "MyApplication"
var isBackground = false
}
override fun onCreate() {
super<Application>.onCreate()
// 생명 주기 관찰 등록
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
override fun onResume(owner: LifecycleOwner) {
Log.d(TAG, "onResume")
// 포그라운드
isBackground = false
}
override fun onPause(owner: LifecycleOwner) {
Log.d(TAG, "onPause")
// 백그라운드
isBackground = true
}
override fun onDestroy(owner: LifecycleOwner) {
Log.d(TAG, "onDestroy")
// 생명 주기 관찰 해제
ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
}
}
LifecycleEventObserver vs DefaultLifecycleObserver
- LifecycleEventObserver : onStateChanged 메서드 하나로 모든 생명주기 상태에 대한 처리
- DefaultLifecycleObserver : 필요한 생명주기 상태를 선택해서 처리
특별한 차이점은 없었고 제가 내린 결론은 둘 중에 아무거나 사용해도 무방합니다!
참고자료
Android Developers : LifecycleObserver
https://jason-api.tistory.com/85
'안드로이드 > 코틀린' 카테고리의 다른 글
안드로이드 소수점 표기 올림? 버림? : String.format, DecimalFormat (0) | 2024.05.10 |
---|---|
코틀린 데이터 변경 감지 : 프로퍼티 위임(Delegated Properties) (0) | 2024.05.08 |
안드로이드 캡처 효과 예제 : CaptureEffectView (0) | 2024.05.02 |
코틀린 화면 캡처 Canvas, PixelCopy 비교 (0) | 2024.04.30 |
Android 14 MediaProjection 권한 허용 : ADB Shell (0) | 2024.04.29 |
댓글