2013年03月20日

Androidアプリでアクティビティの状態を一時保存【InstanceState】

Androidアプリのアクティビティの状態を一時的に保存するためには InstanceState を利用する。


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
posted by 寄り道退屈男 at 12:19 | Comment(0) | TrackBack(0) | Android
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/63890565
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック