Posted at

Androidアプリでforegroundとbackgroundを検知する

More than 3 years have passed since last update.

アプリとして今foregroundにあるのか?backgroundに回っているのか?を検知するクラス。


  • アプリ起動時には○○しない、などの処理に使用した。


ActivityLifecycleCallbacksを拡張する

[参考]

* http://qiita.com/wasnot/items/e7e4699de4b21f150c63

これをベースにさせてもらいました。ActivityのonResume,onPauseで生きているactivityを判定するとFragment系で作っている画面が関わってくるとこの判定が狂う。

今回はほぼすべてのクラスが継承している親Activityが存在したので、そのActivityのライフサイクルを見て判断することにした。

public class MyLifecycleHandler implements Application.ActivityLifecycleCallbacks {

private boolean isForeground = false;

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

}

@Override
public void onActivityStarted(Activity activity) {
}

@Override
public void onActivityResumed(Activity activity) {
if (activity instanceof CommonActivity) {
isForeground = true;
}
}

@Override
public void onActivityPaused(Activity activity) {
if (activity instanceof CommonActivity) {
isForeground = false;
}
}

@Override
public void onActivityStopped(Activity activity) {
}

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

}

@Override
public void onActivityDestroyed(Activity activity) {

}

/**
* アプリが前面にいるかどうかを取得します.
* @return Foregroundにいたら<code>true</code>,backgroundにいたら<code>false</code>をかえします
*/
public boolean isForeground() {
return isForeground;
}

}


ApplicationクラスでHandlerを持っておく

Applicationクラスがhandlerをメンバー変数で持っておいた。

public class MyApplication extends Application {

@Override
public void onCreate() {
lifecycleHandler = new MyLifecycleHandler();
}
~
public boolean isAppForeground(){
return lifecycleHandler.isForeground();
}


アプリがforegroundかどうか取得する

foreground判定が必要なところで、

if(((MyApplication)context.getApplicationContext()).isAppForeground())

などで判定する。

もっとスマートにできたらいいのに!