異常時のActivityデータの保存と復元

3284 ワード

  • 異常時のActivityデータの保存と復元
  • データの保存と復元方法
  • Activity再構築を防止する方法

  • 異常時のActivityデータの保存と復元


    データの保存と復元方法


    通常、Activityのライフサイクルは比較的簡単で、説明は省略されていますが、場合によっては横長画面の切り替えなど、Activityが破棄されて再構築されることを知っています.この場合、ユーザーはすでにいくつかの情報を記入している可能性があります.横長画面の切り替えの場合、処理を行わないと記入された情報が消えてしまう場合、私たちはどのように処理する必要がありますか?
    まず、この場合のActivityのライフサイクルから言えば、縦横画面切り替え時にActivityが破棄され、onPause、onStop、onDestoryが呼び出されますが、Activityが異常な場合に終了するため、onSaveInstanceStateメソッドを呼び出してActivityの状態を保存します.このメソッドはonStopより前に呼び出され、onPauseとは既定のタイミング関係がありません.Activityが再作成されると、onRestoreInstanceStateが呼び出され、以前にonSaveInstanceStateが保存していたデータBundleがonRestoreInstanceStateとonCreateメソッドに渡されるので、onRestoreInstanceStateとonCreateメソッドでActivityが再構築されたかどうかを判断でき、再構築されると、以前に保存したデータを取り出してリカバリすることができます.onRestoreInstanceStateの呼び出しタイミングはonStartの後です.通常のActivityの作成と破棄では、onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドは呼び出されません.
    次に、使用方法を見てみましょう.
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState, outPersistentState);
            outState.putString("editText",myEdit.getText().toString());
        }
    
        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState, persistentState);
            String str = savedInstanceState.getString("editText");
            myEdit.setText(str);
        }

    保存するパラメータをonSaveInstanceStateに保存し、保存したデータをonRestoreInstanceStateで取得して設定するだけです.
    通常、onCreateメソッドを書き換えると、Bundleパラメータが次のように表示されます.
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }

    このパラメータはonRestoreInstanceStateのBundleパラメータと同じですが、onRestoreInstanceStateがBundleがNullの場合は呼び出されません.したがって,onCreate法のBundleパラメータを判断し,Bundleがnullでない場合にデータを復元することもできる.

    Activityの再構築を防止する方法


    画面方向を切り替えるとActivityが再構築されるだけでなく、システム構成が変更されるとActivityが再構築されます.たとえば、ユーザーが外付けキーボードを挿入したり、オペレータが変更したり、インタフェースモード(夜間モードをオンにしたり)が変更されたりすると、Activityが再構築されます.システム構成が変化したときにインタフェースを再構築したくない場合は、AndroidManifestが必要です.xmlでActivityのconfigChange属性を設定します.たとえば、画面の回転時に再構築したくない場合は、次の設定が必要です.
        android:configChanges="orientation"

    複数の属性がある場合は、|で区切ります.
    configChangesで構成できるオプションはたくさんありますが、私たちが使っているのは以下のものが多いです.
    orientation:画面方向が変更されました.例えば、縦画面切り替え;locale:デバイスのローカル位置が変更されました.例えば、システム言語が切り替えられました.keyboard:キーボードタイプが変更されました.例えば、外付けキーボードが挿入されました.keyboardHidden:キーボードのアクセス性が変更されました.たとえば、外付けキーボードが削除されました.
    注意:minSdkValersonとtargetSdkValersonが13より大きい場合、スクリーンを回転させるときにActivityが再起動しないようにscreenSizeを追加する必要があります.