2013年4月27日土曜日

実験:configuration changeによるActivityの再起動を、コードで実現できるのか

実験:configuration changeによるActivityの再起動過程を、コードで再現できるのか

結論:私がやった限りでは、できなさそうである。

configuration changeが発生すると、Activityが再起動される途中で、onSaveInstanceStateメソッドが呼ばれる。
しかしながら、このメソッドはOSが呼び出すのであって、プログラマがコードで呼び出すことはできない。

onConfigurationChangedメソッド内で、Intentに与えるフラグを操作して、新たにActivityを起動してやれば、onSaveInstanceStateメソッドが呼ばれる。
しかし、この場合、旧Activityのdestroyが、新ActivityのonCreateの後に発生する。この挙動は、私の希望ではない。
finishメソッドを使うと、onSaveInstanceStateメソッドは呼ばれない。

onSaveInstanceStateメソッドは、次のとおり書かれてある。
This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state.
しかしながら、実際には、killされない時にも呼ばれる場合がある。
onSaveInstanceStateメソッド内では、killされることを前提にコードを書いてはいけない。データを保存することに徹した方が良い。

端末がスリープ状態にある時に、Eclipseからデバッグ目的でアプリを起動すると、onSaveInstanceStateメソッド&onDestroy()が繰り返し呼ばれる。この問題に対して、AndroidManifest.xmlにおいてandroid:launchMode="singleTop"を施してみたが、効果は無かった。

Android Configuration Changeに書かれてあるように、onDestroy()の中でgetChangingConfigurations()を使うことも役に立ちそうである。

    @Override
    protected void onDestroy(){
        int iConfig = getChangingConfigurations();
        iConfig &= ActivityInfo.CONFIG_ORIENTATION;
        if(iConfig>0){
            Log.d(TAG, "onDestroy() : ConfigurationChange");
        }

この話題はこれ以上つっこむことなく、ここらで引き揚げることにする。

参考
Android: onSaveInstanceState not being called from activity

0 件のコメント:

コメントを投稿