AndroidのActivity状態を保存する方法

6765 ワード

この例は、AndroidがActivity状態を保存する方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
Activityの情報(例えばクラスインスタンスの変数)を保存して他のコンポーネントと共有する必要がない場合は、Activityのget Preferencesメソッドを呼び出すことができます。Preferenceの名前を指定する必要はありません。戻るShardに対して  Preferenceへのアクセスは呼び出しのActivityに限られます。各Activityは、名前のないShared Prferenceオブジェクトをサポートします。
次のフレームコードはActivityのプライベートShared Preferenceをどう使うかを示しています。

protected void saveActivityPreferences()
{
// Create or retrieve the activity preferences object.
SharedPreferences activityPreferences = getPreferences(Activity.MODE_PRIVATE);
// Retrieve an editor to modify the shared preferences.
SharedPreferences.Editor editor = activityPreferences.edit();
// Retrieve the View
TextView myTextView = (TextView)findViewById(R.id.myTextView);
// Store new primitive types in the shared preferences object.
editor.putString("currentTextValue", myTextView.getText().toString());
// Commit changes.
editor.commit();
}

インスタンスの保存と復元
Activityのインスタンスを保存する変数に対して、Androidは、Shared Preferenceを代替する特殊な方法を提供する。
Activityのon SaveInstance Stateイベントハンドリング関数を書き換えることにより、そのBunndleパラメータを使用してインスタンスの値を保存することができます。データを保存する方法はやはりShared Prferenceと同じgetとput方法を使用する。Bunndleの修正が完了したら、親類の処理関数に導入します。以下のコードセグメントに示すように、

private static final String TEXTVIEW_STATE_KEY = "TEXTVIEW_STATE_KEY";
@Override
public void onSaveInstanceState(Bundle outState) {
// Retrieve the View
TextView myTextView = (TextView)findViewById(R.id.myTextView);
// Save its state
outState.putString(TEXTVIEW_STATE_KEY,
myTextView.getText().toString());
super.onSaveInstanceState(outState);
}

この処理関数はActivityのActiveライフサイクルが終了するとトリガされますが、それは明示的に終了しない(すなわち異常終了)だけです。したがって、単一ユーザセッションにおけるActiveライフサイクルの間のActivity状態の一貫性を確保するのに一般的である。
もしセッション中にアプリケーションが再起動されたら、セーブしたBundeleはオンストリップInstance StateとonCreate方法に伝えられます。以下のフラグメントは、Bunndleからどのように値を抽出してActivityのインスタンスを更新するかを示している。

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
TextView myTextView = (TextView)findViewById(R.id.myTextView);
String text = "";
if (icicle != null && icicle.containsKey(TEXTVIEW_STATE_KEY))
text = icicle.getString(TEXTVIEW_STATE_KEY);
myTextView.setText(text);
}

一つ重要なのは、OSaveInstance StateがActivityがActiveではない状態になった時だけ呼び出しをするということを覚えておくことですが、finishを呼び出して、それをオフにしたり、ユーザーがBackボタンを押したりした時に呼び出しません。
To-Do List Activityの状態を保存します。
現在、To-Do List例プログラムが再起動されるたびに、すべてのto-do項目が失われ、テキスト入力ボックスに入力された文字も消去されます。この例では、To-Do Listプログラムの状態をセッション中に保存します。
ToDoList Activityにおける例示的な状態は、3つの変数から構成される。
①新しいItemが追加されていますか?
②新しい項目の入力ボックスにはどのような文字がありますか?
③どれが現在選択されている項目ですか?
ActivityのデフォルトのShared Prferenceを使って、これらの値を保存して、Activityを再起動するとUIを更新することができます。
この章の後に、SQLiteを使ってto-doプロジェクトを保存する方法を学びます。この例は第一歩であり、Activityのインスタンスの詳細を維持することによって、瑕疵のない体験がどのように確保されるかを実証する。
1.静的な文字列を追加して、Preferenceのキーとして使用します。

private static final String TEXT_ENTRY_KEY = "TEXT_ENTRY_KEY";
private static final String ADDING_ITEM_KEY = "ADDING_ITEM_KEY";
private static final String SELECTED_INDEX_KEY = "SELECTED_INDEX_KEY";

2.次に、onPause方法を書き直します。ActivityのプライベートShared Prferenceを取得し、そのEditorオブジェクトを得る。
第1ステップで作成したキーを使用して、インスタンスの値を記憶します。新しい項目が追加されているかどうか、「new item」入力ボックスにあるテキストを含めます。

@Override
protected void onPause(){
super.onPause();
// Get the activity preferences object.
SharedPreferences uiState = getPreferences(0);
// Get the preferences editor.
SharedPreferences.Editor editor = uiState.edit();
// Add the UI state preference values.
editor.putString(TEXT_ENTRY_KEY, myEditText.getText().toString());
editor.putBoolean(ADDING_ITEM_KEY, addingNew);
// Commit the preferences.
editor.commit();
}

3.プログラムを再起動すると、第2ステップに記録されたインスタンスの値を適用します。
OneCreate方法を修正し、最後の部分にrestore UID Stateメソッドの呼び出しを追加します。

@Override
public void onCreate(Bundle icicle)
{
[ ... existing onCreate logic ... ]
restoreUIState();
}
private void restoreUIState()
{
// Get the activity preferences object.
SharedPreferences settings = getPreferences(Activity.MODE_PRIVATE);
// Read the UI state values, specifying default values.
String text = settings.getString(TEXT_ENTRY_KEY, "");
Boolean adding = settings.getBoolean(ADDING_ITEM_KEY, false);
// Restore the UI to the previous state.
if (adding)
{
addNewItem();
myEditText.setText(text);
}
}

4.onsaveInstance State/onRestreet Instance Stateの仕組みを使って、現在選択されている項目の索引を記録します。これは、非ユーザ明示的な命令がアプリケーションを殺すときだけ保存して適用します。

@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putInt(SELECTED_INDEX_KEY, myListView.getSelectedItemPosition());
super.onSaveInstanceState(outState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
int pos = -1;
if (savedInstanceState != null)
if (savedInstanceState.containsKey(SELECTED_INDEX_KEY))
pos = savedInstanceState.getInt(SELECTED_INDEX_KEY, -1);
myListView.setSelection(pos);
}

To-Do Listプログラムを実行すると、セッション中のUI状態の保存が見られます。しかし、to-doリストの項目はまだ保存できません。この章の後に、このコアの機能を追加します。
Android関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Androidプログラミングのactivity操作技術のまとめ」、「AndroidビューViewテクニックのまとめ」、「Android操作SQLiteデータベース技術まとめ」、「Android操作json形式データ技術のまとめ」、「Androidデータベース操作技術のまとめ」、「Androidファイルの操作テクニックのまとめ」、「Androidプログラミング開発のSDカード操作方法のまとめ」、「Android開発入門と上級教程」、「Android資源操作技術のまとめ」、「Androidコントロールの使い方のまとめ
ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。