LoginSignup
27

More than 5 years have passed since last update.

Androidでアプリがバックグラウンドに回った時とフォアグラウンドに戻った時のイベント取得方法

Posted at

AndroidはiOSのようにホームボタンなどでアプリがバックグラウンドに行った時のイベントが取れません。

iOSでバックグラウンドとフォアグラウンドのイベント取得の仕方

アプリが非アクティブになりバックグランド実行になった際に呼び出される

- (void)applicationDidEnterBackground:(UIApplication *)application

バックグラウンドから起動された場合

- (void)applicationWillEnterForeground:(UIApplication *)application

Androidの場合

以下のメソッドをActivityでオーバーライドすれば、ホームボタンを押した時のイベントを検知できますが、
電話が来た時とかなどはここに入ってこないようです。
Activityの遷移時などでも呼ばれてしまうようなので、工夫すればなんとかなりそうです。
あと、バックボタンでは検知されないようです。

    @Override
    public void onUserLeaveHint(){}

[参照]
* Android開発 ホームボタン押下やアプリ切り替わりを検知する
* Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。

電話が来た時でもバックグラウンドとみなす方法としてこんなやり方がありました。

How to detect when an Android app goes to the background and come back to the foreground

まずアプリケーションクラスを継承し、TimerとTimerTaskのメンバ変数を定義します。
Activity遷移の時間(MAX_ACTIVITY_TRANSITION_TIME_MS)も定義します。※後々説明します。

MyApplication
public class MyApplication extends Application {

    private Timer mActivityTransitionTimer;
    private TimerTask mActivityTransitionTimerTask;
    public boolean wasInBackground;
    private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000;
    ...

タイマーを動かす為のメソッドを二つ用意しています。

MyApplication
public void startActivityTransitionTimer() {
    this.mActivityTransitionTimer = new Timer();
    this.mActivityTransitionTimerTask = new TimerTask() {
        public void run() {
            MyApplication.this.wasInBackground = true;
        }
    };

    this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask,
                                           MAX_ACTIVITY_TRANSITION_TIME_MS);
}

public void stopActivityTransitionTimer() {
    if (this.mActivityTransitionTimerTask != null) {
        this.mActivityTransitionTimerTask.cancel();
    }

    if (this.mActivityTransitionTimer != null) {
        this.mActivityTransitionTimer.cancel();
    }

    this.wasInBackground = false;
}

各ActivityのonResumeとonPauseで先ほど用意したメソッドをコールします。
ベースActivityに定義すると良いと思います。

Activity
@Override
public void onResume()
{
    super.onResume();

    MyApplication myApp = (MyApplication)this.getApplication();
    if (myApp.wasInBackground)
    {
        //Do specific came-here-from-background code
    }

    myApp.stopActivityTransitionTimer();
}

@Override
public void onPause()
{
    super.onPause();
    ((MyApplication)this.getApplication()).startActivityTransitionTimer();
}

大体の流れ

  1. ホームボタンなどでバックグラウンドに遷移(onPause)
  2. タイマーを動かす(MyApplication.startActivityTransitionTimer)
  3. 2秒以上経過(MAX_ACTIVITY_TRANSITION_TIME_MS)
  4. wasInBackgroundのフラグをtrueにする(バックグラウンドに行ったとみなす)
  5. アプリを復帰させる(onResume)。ここでフラグを確認してバックグラウンドに行ったかどうかを確認する
  6. タイマーを停止させる(MyApplication.stopActivityTransitionTimer)

こんな感じみたいです。

上記のアラームで検出するパターンのプロジェクトも置いてくのでよかったら参照してみてください。
https://github.com/datsnet/AppBackgroundStatus

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27