finish()が実行されるタイミングの続きの話題です。
finish()が実行されるとdestroy()が実行されます。しかし、そのアプリのプロセスは生き残っています。DDMSやデバッガでそのことを確認できることは周知のとおりです。
destroyされた後の状態で、エミュレータのアプリの起動アイコンをクリックすると、destroyされたアプリが立ち上がってくるのです!おお!こんなことができるとは知らなかった。デバッガも立ち上がって来るので、finish()したアプリが同一のプロセスで稼働しているということが確認できます。
他のプラットフォームにおける思い込みを捨てて、認識を新たにする必要があります。
そこで、下記の実験用プログラムを作成し、
1.デバッガから実行しました。実行させても、finish()により、直ぐに終了します。
2.そして、エミュレータにある(finish()によるdestroy後の)アプリの起動アイコンをクリックし実行させました。
つまり合計で2回実行させました。
public class StaticActivity extends Activity {
static String sStatic = "at field";
String sNoStatic = "at field";
public StaticActivity(){
Log.d("StaticAct", "at constructor:sStatic=" + sStatic);
Log.d("StaticAct", "at constructor:sNoStatic=" + sNoStatic);
sStatic = "at constructor";
sNoStatic = "at constructor";
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("StaticAct", "onCreate:sStatic=" + sStatic);
Log.d("StaticAct", "onCreate:sNoStatic=" + sNoStatic);
sStatic = "at onCreate";
sNoStatic = "at onCreate";
finish();
}
}
ログには次のとおり出力されました。
第一回目の出力
08-26 15:36:28.415: DEBUG/StaticAct(5031): at constructor:sStatic=at field
08-26 15:36:34.515: DEBUG/StaticAct(5031): at constructor:sNoStatic=at field
08-26 15:36:38.855: DEBUG/StaticAct(5031): onCreate:sStatic=at constructor
08-26 15:36:38.855: DEBUG/StaticAct(5031): onCreate:sNoStatic=at construct
第二回目の出力
08-26 15:37:16.655: DEBUG/StaticAct(5031): at constructor:sStatic=at onCreate
08-26 15:37:16.655: DEBUG/StaticAct(5031): at constructor:sNoStatic=at field
08-26 15:37:17.207: DEBUG/StaticAct(5031): onCreate:sStatic=at constructor
08-26 15:37:17.207: DEBUG/StaticAct(5031): onCreate:sNoStatic=at constructor
このことから、adsaria氏が言うように、「次回、再利用する時にはスタティックなメンバ変数の初期化は行ってくれない。」と言えるのです。
このような仕組みを、便利だと捉えるか、危険だと捉えるか、考え方はいろいろありましょうが、いずれにしても留意はしなければなりません。