IT/안드로이드+JAVA

[Android] Foreground, Background 감지 (ActivityLifecycleCallbacks)

안경 쓴 귀니 2022. 3. 14. 20:37
반응형

안드로이드에서 Foreground, Background를 감지하는 방법

 

Foreground, Background를 감지하는 방법은 아래 두 가지 경우로 나눌 수 있습니다.

 

1. Background/Foreground로 변경됐을 때 감지하는 방법

  - Background -> Foreground로 변경된 경우

  - Foreground -> Background로 변경된 경우

 

2. 현재 상태가 Background/Foreground인지 체크하는 방법

  - 현재 Background 인지 체크하는 경우

  - 현재 Foreground 인지 체크하는 경우

 

 

Github 샘플

 

https://github.com/eunsuu1015/AndroidSample/tree/main/ActivityLifecycleCallbacks

 

GitHub - eunsuu1015/AndroidSample

Contribute to eunsuu1015/AndroidSample development by creating an account on GitHub.

github.com

 

 

사용 API

 

https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks

 

Application.ActivityLifecycleCallbacks  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

샘플 코드

 

생성자에서 ActivityLifecycleCallback을 register 하고

그 이후부터 백그라운드 또는 포그라운드 상태로 변경됐을 때, Listener를 통해 콜백을 호출합니다.

register 후에 getInstance()를 통해 현재 백그라운드인지 포그라운드인지 isBackground(), isForeground() 간단하게 조회할 수도 있습니다.

 

public class ForegroundDetector implements Application.ActivityLifecycleCallbacks {

    enum State {
        None, Foreground, Background
    }
    private State state;
    private static ForegroundDetector Instance = null;
    private Application application = null;
    private Listener listener = null;
    private boolean isChangingConfigurations = false;
    private int running = 0;

    public interface Listener {
        void onBecameForeground();
        void onBecameBackground();
    }

    public static ForegroundDetector getInstance() {
        return Instance;
    }

    public ForegroundDetector(Application application) {
        Instance = this;
        this.application = application;
        application.registerActivityLifecycleCallbacks(this);
    }

    public void unregisterCallbacks() {
        this.application.unregisterActivityLifecycleCallbacks(this);
    }

    public void addListener(Listener listener) {
        state = State.None;
        this.listener = listener;
    }

    public void removeListener() {
        state = State.None;
    }

    public boolean isBackground() {
        return state == State.Background;
    }

    public boolean isForeground() {
        return state == State.Foreground;
    }

    @Override
    public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {

    }

    @Override
    public void onActivityStarted(@NonNull Activity activity) {
        if (++running == 1 && !isChangingConfigurations) {
            state = State.Foreground;
            if (listener != null)
                listener.onBecameForeground();
        }
    }

    @Override
    public void onActivityResumed(@NonNull Activity activity) {

    }

    @Override
    public void onActivityPaused(@NonNull Activity activity) {

    }

    @Override
    public void onActivityStopped(@NonNull Activity activity) {
        isChangingConfigurations = activity.isChangingConfigurations();
        if (--running == 0 && !isChangingConfigurations) {
            state = State.Background;
            if (listener != null)
                listener.onBecameBackground();
        }
    }

    @Override
    public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(@NonNull Activity activity) {

    }
}

 

 

사용 방법

 

사용은 아래와 같이 Application 및 Activity 등에서 가능합니다.

 

1. Application에서 Background/Foreground로 변경됐을 때 감지하는 방법

public class MyApplication extends Application {

    private ForegroundDetector foregroundDetector;

    @Override
    public void onCreate() {
        super.onCreate();

        foregroundDetector = new ForegroundDetector(MyApplication.this);
        foregroundDetector.addListener(new ForegroundDetector.Listener() {
            @Override
            public void onBecameForeground() {
                Log.d("TAG", "Became Foreground");
            }

            @Override
            public void onBecameBackground() {
                Log.d("TAG", "Became Background");
            }
        });
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        foregroundDetector.unregisterCallbacks();
    }
}

 

2. Activity에서 현재 상태가 Background/Foreground인지 체크하는 방법

public void onClick() {
    ForegroundDetector.getInstance().isForeground();
    ForegroundDetector.getInstance().isBackground();
}

 

반응형