본문 바로가기

나의 플랫폼/안드로이드

[Android] App Foreground Background

 Activity에 상태를 통하여 지금 현재 화면이 어떻게 되어 있는지 판단하는건 안드로이드 기초이기 때문에 대부분 알고 있을 것이다.

OnResume을 하면 화면이 재실행 되는 단계이며 (화면 이동에서 많이 쓰임) OnPause를 하면 화면이 멈추었다 보이지 않게 되었다는 판단을 내릴 수 있다.


 Android 각 Activity가 아닌 App 전체에 대한 상태는 무엇으로 판단을 할까???

지금 App이 Foreground 상태인지 Background 상태인지 아니면 다시 Foreground로 돌아온 것인지.. 알아야할 때가 있을 수도 있다.


 이때 아래와 같은 방법을 이용해 보아라.


Android에는 Application이라는 App전체를 총괄하는 클래스가 있다.

Application을 커스텀화 하여 많이 사용 한다.


App 에러가 발생했을 경우, 캐치하기 위해 UncaughtExceptionHandler 핸들러를 설정하여 관리하기도 한다.

(구글링을 하면 금방 나오니 한번 찾아보시길 바란다.)


이 커스텀화 한 Application 클래스에 ActivityLifecycleCallbacks 을 등록 시킨다. 방법은 아래와 같다.



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

registerActivityLifecycleCallbacks(new MyActivityLifecycleCallbacks());


}

// Get app is foreground
public AppStatus getAppStatus() {
return mAppStatus;
}

// check if app is return foreground
public boolean isReturnedForground() {
return mAppStatus.ordinal() == AppStatus.RETURNED_TO_FOREGROUND.ordinal();
}

public enum AppStatus {
BACKGROUND, // app is background
RETURNED_TO_FOREGROUND, // app returned to foreground(or first launch)
FOREGROUND; // app is foreground
}

public class MyActivityLifecycleCallbacksimplements ActivityLifecycleCallbacks {

// running activity count
private int running = 0;

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {

}

@Override
public void onActivityStarted(Activity activity) {
if (++running == 1) {
// running activity is 1,
// app must be returned from background just now (or first launch)
mAppStatus = AppStatus.RETURNED_TO_FOREGROUND;
} else if (running > 1) {
// 2 or more running activities,
// should be foreground already.
mAppStatus = AppStatus.FOREGROUND;
}
}

@Override
public void onActivityResumed(Activity activity) {
}

@Override
public void onActivityPaused(Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
if (--running == 0) {
// no active activity
// app goes to background
mAppStatus = AppStatus.BACKGROUND;
}
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

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


위 같이 해놓고~ App 내부에서 어떻게 판단하나!!

아주 간단하다.


if (getApplication() instanceof CustomApp) {
if (((CustomApp)getApplication()).isReturnedForground()) {
// do something!!

}
}

이렇게 getApplication 함수를 통하여 Application 클래스를 가지고 온 후, 해당 함수를 호출하면 된다^^


참고하세요.


출처 : http://yslibrary.net/2015/07/30/android_how_to_detect_app_is_background_or_not/




















  • 경훈 2016.10.14 12:31

    와... 이런 좋은방법이!!!!
    정말 감사합니다!!!

  • ParkJ 2017.04.14 15:21

    와 감사합니다 ㅋㅋㅋ 정말 필요했는데 여기에만 글이 딱! 있네요 다른 라이브러리 추가 안해도 되고 ㅎㅎㅎ 감사합니다~~~~~~~~~~~~~ 히히

    아 맨 밑에 getApplication() insteadof 할 때 비교하는 어플리케이션 이름은 저 글기준으로 CustomApp 입니다 CustomQApp 은 잘못적으신듯 ㅋ