2011/03/26
ホームボタン と 戻るボタン で Activity の終了処理が異なる
Android の Activity は以下のようなライフサイクルを持っているというのは、大抵の本やサイトで紹介されています。(以下の図は Tech Booster さんから頂きました。大変わかり易いです)
ただ、「Activity がもう表示されない」という状態も
- 戻るボタンで Activity が消える
- ホームボタンで Activity が消える
- 省電力モードになって画面が消える
- 他のアプリケーションがかぶさって Activity が消える
そして、最近気づいたのですが、これらのパターンで呼ばれるイベントが異なるようなのです。
以下、Xperia で動作させてみたときのログです。
起動
DEBUG/LifeCycleTest(3005): onCreate DEBUG/LifeCycleTest(3005): onStart DEBUG/LifeCycleTest(3005): onResume
↓
戻るボタン
DEBUG/LifeCycleTest(3005): onPause DEBUG/LifeCycleTest(3005): onStop DEBUG/LifeCycleTest(3005): onDestroy
↓
アイコンクリック
DEBUG/LifeCycleTest(3005): onCreate DEBUG/LifeCycleTest(3005): onStart DEBUG/LifeCycleTest(3005): onResume
↓
ホームボタン
DEBUG/LifeCycleTest(3005): onSaveInstanceState DEBUG/LifeCycleTest(3005): onPause DEBUG/LifeCycleTest(3005): onStop
↓
アイコンクリック
DEBUG/LifeCycleTest(3005): onRestart DEBUG/LifeCycleTest(3005): onStart DEBUG/LifeCycleTest(3005): onResume
↓
時間がたって画面消灯
DEBUG/LifeCycleTest(3028): onSaveInstanceState DEBUG/LifeCycleTest(3028): onPause
↓
電源ボタン
DEBUG/LifeCycleTest(3028): onResume
↓
画面回転
DEBUG/LifeCycleTest(3028): onSaveInstanceState DEBUG/LifeCycleTest(3028): onPause DEBUG/LifeCycleTest(3028): onStop DEBUG/LifeCycleTest(3028): onDestroy DEBUG/LifeCycleTest(3028): onCreate DEBUG/LifeCycleTest(3028): onStart DEBUG/LifeCycleTest(3028): onRestoreInstanceState DEBUG/LifeCycleTest(3028): onResume
↓
ハードウェアキーでカメラアプリ起動
DEBUG/LifeCycleTest(3028): onSaveInstanceState DEBUG/LifeCycleTest(3028): onPause DEBUG/LifeCycleTest(3028): onStop
戻るボタンで Activity が見えなくなる場合は onDestroy が呼ばれてアプリケーションが終了しているのに対し、ホームボタンの場合は onPause でサスペンド状態になるようです。
ユーザから見ると、どちらも同じ動作に見えるんですけどね。
また、単に画面が消える場合は onStop で止まるようです。
あと、 onSaveInstanceState と onRestoreInstanceState は呼ばれる時と呼ばれない時があるみたいです。これ、対になっていないと意味がないような気がするのですが…
この結果だけみると、あまり使い道が無いような気がします。
この辺については、もう少し調べてみる必要がありそうです。
誰か詳しい方がいらっしゃいましたら、是非教えてください。
2011/10/11 追記
「ユーザから見ると、どちらも同じ動作に見えるんですけどね」と書いたのですが、Androidの思想的には全然違う動作のようです。
ホームボタンを押した場合は、ホームアプリケーションが起動して現在のアプリケーションが後ろに隠れるだけなのに対し、戻るボタンはActivityスタックからポップするという動作になるようです。
Activityのスタックについては、Y.A.M の 雑記帳: Android Activity, Task, Stack, Launch mode が非常にわかりやすかったので、是非参考にしてみてください。
以下に、実際に動作させたコードを載せておきます。
単にイベントの中でログを出力させているだけです。
MainActivity.java
package com.kokufu.test.lifecycletest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "LifeCycleTest";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d(TAG, "onSaveInstanceState");
super.onSaveInstanceState(outState);
}
@Override
protected void onPause() {
Log.d(TAG, "onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
}

0 件のコメント:
コメントを投稿