안드로이드에서 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
사용 API
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks
샘플 코드
생성자에서 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();
}
'IT > 안드로이드+JAVA' 카테고리의 다른 글
[AndroidStudio] An exception occurred applying plugin request 오류 해결 방법 (0) | 2022.01.21 |
---|---|
[Android] Database 파일명 변경하기 (rename db filename) (0) | 2021.12.22 |
[Android] 앱 다크 모드 비활성화 방법 (Dark Mode) (0) | 2021.12.15 |
[Android] Handler() deprecated (0) | 2021.10.07 |
[Android] getDrawable() deprecated (1) | 2021.10.06 |