2011年8月27日土曜日

static変数の値は次回起動へ継承される

static変数の値は次回起動へ継承される

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

第二回目のログのstatic変数の最初の内容は、第一回目の実行の最後に代入した値("at onCreate")が残ったままになっています。
このことから、adsaria氏が言うように、「次回、再利用する時にはスタティックなメンバ変数の初期化は行ってくれない。」と言えるのです。

このような仕組みを、便利だと捉えるか、危険だと捉えるか、考え方はいろいろありましょうが、いずれにしても留意はしなければなりません。

0 件のコメント:

コメントを投稿