InstanceStateはどういう時に使えるのか
他のアプリが呼び出されて現在表示されているアプリがバックグラウンドに回された時、メモリ状態によってはバックグラウンドのインスタンスが破棄されてしまう。その際、消されては困るアクティビティの状態を待避させるときに InstanceState は役立つのだ。
しかしこれはあくまでも「一時保存」に限る。
永続保存したいデータは、後日紹介する方法(ファイルやデータベース、SharedPreferences)で保存すべし。
では、ここで作った MyFirstApp に InstanceState を利用した状態保存処理を追加してみよう。
MainActivity.java
package com.example.myfirstapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
// InstanceStateへ状態を保存するためのキー
public final static String STATE_ENTERED_MESSAGE = "state.enteredmessage";
private String message = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// InstanceState へ 入力されたメッセージを保存
outState.putString(STATE_ENTERED_MESSAGE, message);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// InstanceStateから保存しておいた値を取り出す
message = savedInstanceState.getString(STATE_ENTERED_MESSAGE);
}
}
重要な処理は以下の通り。
message = editText.getText().toString();
ここでメンバ変数に用意した message にテキストボックスからの入力値を随時保存し、
@Override
protected void onSaveInstanceState(Bundle outState) {
// InstanceState へ 入力されたメッセージを保存
outState.putString(STATE_ENTERED_MESSAGE, message);
super.onSaveInstanceState(outState);
}
message を InstanceStateへ保存する処理を実装。
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// InstanceStateから保存しておいた値を取り出す
message = savedInstanceState.getString(STATE_ENTERED_MESSAGE);
}
そしてアプリが復帰した時に message を復帰させる処理も実装する。
以上である。
これでInstanceStateの使い方がおおまかに理解できたと思う。
【注意!】
onSaveInstanceState() は必ず呼び出されるという保証はないのでご用心。
参考にさせてもらったサイト:
Recreating an Activity:Android Developers
onSaveInstanceStateでインスタンスを保存する:Tech Booster