スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Android] アクティビティの状態遷移の実験 その2

Android アクティビティの状態遷移について、再度実験を行った。
前回と同様の実験なのだが、コンストラクタがどのように呼ばれるのか、についての調査を加えてある。
さらに、呼び出し元のActivityのステイタス変化についても調べた。

Android の Activity には、以下の7つの状態が存在し、状態の変化が起こった場合にはそれぞれ対応するメソッドが呼ばれる。

1) onCreate
2) onRestart
3) onStart
4) onResume
5) onPause
6) onStop
7) onDestroy

以下のようなコードを書いて、実際のところ、どのような状況でどのようにステイタスが変化するのかを調べる実験を行った。

package jp.android.TestActivityStatus;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class DoTestActivity extends Activity {

static final String TAG = "DoTestActivity";
String mParam;

public DoTestActivity() {
super();
Log.i(TAG, "*** constructed ***");
}

@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.do_test);

// 呼び出し元から渡されたパラメータを取り出す
Bundle extras = getIntent().getExtras();
if (extras != null) {
mParam = (String)extras.getSerializable("Param");
if (mParam != null) {
Log.d(TAG, "Param を取得できた");
} else {
Log.d(TAG, "ScheduleSetting が空だ!");
}
} else {
Log.d(TAG, "getExtras()がnullを返した!");
}
}

@Override
public void onStart() {
Log.i(TAG, "onStart");
super.onStart();
}

@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
}

@Override
public void onPause() {
Log.i(TAG, "onPause");
super.onPause();
}

@Override
public void onStop() {
Log.i(TAG, "onStop");
super.onStop();
}

@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
}

@Override
public void onRestart() {
Log.i(TAG, "onRestart");
super.onRestart();
}
}


このインテントを起動(?)する側は、以下のように、putExtra() によってパラメータ(?)を与えるようにしている。
呼び出された方のアクティビティで、そのパラメータがきちんと取得できるかどうか、という点も、実験によって明らかにしたかったのだ。

Intent intent = new Intent(getApplicationContext(), ActivityStatusActivity.class);
intent.putExtra("Param", "ほげほげ");
startActivityForResult(intent, 1);




■実験結果

実験結果は以下のとおりだった。


1) 最初にアクティビティが表示された時

INFO/DoTestActivity(1309): *** constructed ***
INFO/DoTestActivity(1309): onCreate
DEBUG/DoTestActivity(1309): Param を取得できた
INFO/DoTestActivity(1309): onStart
INFO/DoTestActivity(1309): onResume


2) その状態で、携帯端末を90度回転させた時

INFO/DoTestActivity(1309): onPause
INFO/DoTestActivity(1309): onStop
INFO/DoTestActivity(1309): onDestroy
INFO/DoTestActivity(1309): *** constructed ***
INFO/DoTestActivity(1309): onCreate
DEBUG/DoTestActivity(1309): Param を取得できた
INFO/DoTestActivity(1309): onStart
INFO/DoTestActivity(1309): onResume

このように、回転させるとなんと、一旦アクティビティは Destroy されることが分かった!!
また、Destroyされているにもかかわらず、呼び出し側がセットしていたパラメータが再度取得可能な状態であった点には驚いた。


3) アクティビティ表示状態から、[戻る]ボタン(ハードウェアのボタン)を押した時

INFO/DoTestActivity(1309): onPause
INFO/呼び出し元のActivity(1309): onDestroy
INFO/呼び出し元のActivity(1309): *** constructed ***
INFO/呼び出し元のActivity(1309): onCreate
INFO/呼び出し元のActivity(1309): onStart
INFO/呼び出し元のActivity(1309): onResume
INFO/DoTestActivity(1309): onStop
INFO/DoTestActivity(1309): onDestroy

このように、[戻る]ボタンを押した場合は、Activity#onDestroy() が呼ばれることが見て取れる。
呼び出し元のActivityが、一旦Destroyされた後で再構築される点が意外だ。


4) アクティビティ表示状態から、[ホーム]ボタン(ハードウェアのボタン)を押した時

INFO/DoTestActivity(1309): onPause
INFO/DoTestActivity(1309): onStop

このように、[ホーム]ボタンを押した場合は、Destroyされないことが見て取れる。


5) 上記 4) の状態から、再度アプリを起動した時

この場合は2つのパターンが見られた。

a. パターンその1
INFO/DoTestActivity(1309): onDestroy
INFO/DoTestActivity(1309): *** constructed ***
INFO/DoTestActivity(1309): onCreate
DEBUG/DoTestActivity(1309): Param を取得できた
INFO/DoTestActivity(1309): onStart
INFO/DoTestActivity(1309): onResume

b.パターンその2
INFO/DoTestActivity(1376): onRestart
INFO/DoTestActivity(1376): onStart
INFO/DoTestActivity(1376): onResume

パターンその1ではActivityが再構築されているが、パターンその2では単にリスタートされている。
システムのメモリ使用状況等によって変わるのかもしれない。


6) 自動消灯

一定時間放置しておいて、スクリーンが自動消灯した場合にどうなるかを見てみた。

INFO/DoTestActivity(1309): onPause


7) 自動消灯した状態から、点灯

上記 6) の状態から、電源ボタンを押した場合、つまり、消灯状態から復帰した場合にどうなるかを見てみた。

INFO/DoTestActivity(1309): onResume


8) 点灯後に、ロック解除

上記 7) の操作を行うと、ロック解除画面になるが(ロック設定している場合)、ロック解除を行うとどうなるかを調べた。
この場合、特にステイタスに変化はなかった。
つまり、上記 7) の操作で onResume が呼ばれた後で、変化はなかった。



スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。