개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 이번 포스팅에서는 앱이 백그라운드로 전환되고, 다시 포그라운드로 돌아오는 이벤트를 감지하는 기능에 대해 알아보겠습니다.

 

간단하게 설명드리면 LifecycleEventObserverApplication을 implement 하여 생명주기에 발생에 따라 이벤트를 감지하여 처리하는 구조입니다.

 

간단한 예제와 함께 설명드리겠습니다.

 


 

결과 GIF🎬

 

아래와 같이 백그라운드로 전환 후 다시 돌아오는 이벤트를 반복하여 확인했습니다.

 

 

 

결과 로그

최초 포그라운드로 접근시 찍히는 로그입니다.

 

백그라운드로 전환될 때 찍히는 로그입니다.

 

다시 포그라운드로 전환될 때 찍히는 로그입니다.

 

 

본문

 

위의 로그에서 보이듯 targetState와 event의 Lifecycle이 다릅니다. 

 

targetState는 LifeCycle Event가 아닌 OnLifecycleEvent에서 사용되는 특수한 값이므로 LifeCycle.State에서 불러와야 합니다.

 

아래 코드에서 targetState로 라이프사이클을 구분하시려면 Lifecycle.State.STARTED 와 같이 사용하시면 됩니다.

 

 

라이브러리 추가

앱의 LifeCycle을 감지하기 위해 build.gradle 파일에 라이브러리를 추가해줍니다.

implementation 'androidx.lifecycle:lifecycle-process:2.5.1'

(라이브러리 버전은 프로젝트의 자바 및 코틀린 버전과 비교하여 지원되는 최신 버전을 사용해주세요)

 

 

 

라이프사이클 옵저버 클래스 생성

 

Kotlin - <LifeCycleChecker.kt>

import android.app.Application
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner


class LifeCycleChecker : Application(), LifecycleEventObserver {
    var isForeground = false
    private val lifecycle by lazy { ProcessLifecycleOwner.get().lifecycle }

    override fun onCreate() {
        super.onCreate()
        Log.d("tag_lc", "옵저버 생성")
        lifecycle.addObserver(this)
    }

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        Log.d("tag_lc", "targetState : ${event.targetState} event : $event")
        when (event) {
            Lifecycle.Event.ON_STOP -> {
                isForeground = false
                Log.d("tag_lc", "앱이 백그라운드로 전환")
            }
            Lifecycle.Event.ON_START -> {
                isForeground = true
                Log.d("tag_lc", "앱이 포그라운드로 전환")
            }
            else -> {}
        }
    }
}

 

 

Java - <LifeCycleCheck.java>

import android.app.Application;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;

public class LifeCycleChecker extends Application implements LifecycleEventObserver {

    public boolean isForeground = false;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("tag_lc", "옵저버 생성");
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        Log.d("tag_lc", "targetState : " + event.getTargetState() + " event : " + event);
        if (event == Lifecycle.Event.ON_STOP) {
            isForeground = false;
            Log.d("tag_lc", "앱이 백그라운드로 전환");
        } else if (event == Lifecycle.Event.ON_START) {
            isForeground = true;
            Log.d("tag_lc", "앱이 포그라운드로 전환");
        }
    }
}

 

 

시작 액티비티에서 옵저버 생성

 

Kotlin - <MainActivity.kt>

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    LifeCycleChecker().onCreate()
}

 

Java - <MainActivity.java>

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    LifeCycleChecker checker = new LifeCycleChecker();
    checker.onCreate();
}

 

 

감사합니다.