개발 창고/Android

[Kotlin] How to check the resume and pause of all activities

로이제로 2023. 11. 23. 22:00
반응형

 

How to check the resume and pause of all activities

 일반적으로 onCreate와 onStop, onPause, onResume를 이용하여 activity의 생명주기를 체크합니다. 하지만 이는 해당 activity만을 체크하기 때문에 전체 application을 사용자가 사용 중인지, 사용을 멈췄는지에 대해 알 기 어렵습니다. 어렵다고 하는 이유는, 아예 없는 건 아니기 때문인데, 가령 모든 activity의 상태를 공통으로 관리하는 array를 만들어 각각의 activity이 생명주기가 변할 때마다 이를 배열에 체크해 줄 수도 있기 때문입니다. 이는 몇 건 안 되는 activity를 관리하기에는 용이하지만, activity가 많아질수록 관리가 힘들어집니다.

 

1. 종속성 추가

dependencies {
    ...
    implementation 'androidx.lifecycle:lifecycle-process:2.6.1'
    ...
}

build.gradle (:app)의 dependencies에 lifecycle-process를 추가해줍니다. 23년 7월 30일 기준 최신 버전은 2.6.1입니다.

 

2. Application 생성

Activity의 상위 개념인 Application은 일반적으로 선언되어 사용 되지 않지만 개인화하여 사용할 수 있습니다. 주로 공통으로 사용해야 하는 항목 들이나 Spring의 AOP개념을 적용할 때도 유용합니다.

import android.app.Application
import android.util.Log
import androidx.lifecycle.*

class GlobalApplication : Application() {
    val TAG = "GlobalApplication"

    override fun onCreate() {
        super.onCreate()

        // 다른 초기화 코드들

        // 프로세스 상태 모니터링 시작
        ProcessLifecycleOwner.get().lifecycle.addObserver(object: LifecycleEventObserver {
            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                // Step. 어플리케이션이 시작된 경우
                if (event == Lifecycle.Event.ON_RESUME) {
                    Log.d(TAG, "Application Resume")

                } else if (event == Lifecycle.Event.ON_PAUSE) {
                    Log.d(TAG, "Application Paused")
                }
            }
        })
    }
}

위와 같이 GlobalApplication을 생성하여 Application을 상속 받아줍니다.

이후 onCreate 메서드에 ProcessLifecycleOwner에 상태 모니터링을 추가해 줍니다.

이때 event가

Lifecycle.Event.ON_RESUME 이면, 사용자가 이 어플을 사용 중인 경우이고

Lifecycle.Event.ON_PAUSE 이면, 사용자가 이 어플을 사용 중이 아닌 경우이므로

원하는 Action을 해당 위치에 넣어서 처리할 수 있습니다.

 

3. Application 적용

생성한 GlobalApplication을 적용하기 위해서는 AndroidManifest.xml의 <application></application>에 다음과 같이 선언해 주어야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:name=".GlobalApplication"
        ...
    >

    ....

    </application>
</manifest>

name에 해당 클래스명을 입력해 주면 GlobalApplication이 사용 가능하게 됩니다.

 

이 글은 아래 사이트를 참조하여 작성되었습니다.

https://developer.android.com/reference/kotlin/androidx/lifecycle/ProcessLifecycleOwner

 

ProcessLifecycleOwner  |  Android Developers

androidx.compose.desktop.ui.tooling.preview

developer.android.com

 

반응형