異常時のActivityデータの保存と復元
3284 ワード
異常時の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を追加する必要があります.