Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

datsnet
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした