AndroidはiOSのようにホームボタンなどでアプリがバックグラウンドに行った時のイベントが取れません。
iOSでバックグラウンドとフォアグラウンドのイベント取得の仕方
アプリが非アクティブになりバックグランド実行になった際に呼び出される
- (void)applicationDidEnterBackground:(UIApplication *)application
バックグラウンドから起動された場合
- (void)applicationWillEnterForeground:(UIApplication *)application
Androidの場合
以下のメソッドをActivityでオーバーライドすれば、ホームボタンを押した時のイベントを検知できますが、
電話が来た時とかなどはここに入ってこないようです。
Activityの遷移時などでも呼ばれてしまうようなので、工夫すればなんとかなりそうです。
あと、バックボタンでは検知されないようです。
@Override
public void onUserLeaveHint(){}
[参照]
- Android開発 ホームボタン押下やアプリ切り替わりを検知する
- [Y.A.M の 雑記帳: Android Home キーが押されたことを検知する。] (http://y-anz-m.blogspot.jp/2010/10/androidhome.html)
電話が来た時でもバックグラウンドとみなす方法としてこんなやり方がありました。
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)も定義します。※後々説明します。
public class MyApplication extends Application {
private Timer mActivityTransitionTimer;
private TimerTask mActivityTransitionTimerTask;
public boolean wasInBackground;
private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000;
...
タイマーを動かす為のメソッドを二つ用意しています。
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に定義すると良いと思います。
@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();
}
大体の流れ
- ホームボタンなどでバックグラウンドに遷移(onPause)
- タイマーを動かす(MyApplication.startActivityTransitionTimer)
- 2秒以上経過(MAX_ACTIVITY_TRANSITION_TIME_MS)
- wasInBackgroundのフラグをtrueにする(バックグラウンドに行ったとみなす)
- アプリを復帰させる(onResume)。ここでフラグを確認してバックグラウンドに行ったかどうかを確認する
- タイマーを停止させる(MyApplication.stopActivityTransitionTimer)
こんな感じみたいです。
上記のアラームで検出するパターンのプロジェクトも置いてくのでよかったら参照してみてください。
https://github.com/datsnet/AppBackgroundStatus