activityは、画像の回転やブラウザの移動に伴い、破棄されて新しいactivityに
生成されるライフサイクルを持っています。
仮に遷移前にメンバ変数を持っていた場合、移動後は基本destroyされ
またonCreateされるため、持っていた値が無かったことになり
全部消えてしまいます。
値を保存して新しいactivity生成時にまた同じ値を使いたいという時は、
onSaveInstanceStateを使って保存する方法があります。
保存対象は主にメンバ変数で、edittextやtextViewといったview系の値はviewが独自で
復元してくれるのでそちらは考慮する必要はないです。
ではどうやって保存するかというと、まずonSaveInstanceStateメソッドをこのように
書いていきます。
@Override protected void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putString("str", mName); savedInstanceState.putInt("int", mAge); }
保存する値は、Bundleというクラスが持っているput○○というメソッドに
持たせて保存します。
この他にも、浮動所数点以下の値を保存できるputFloatや画像を保存する
putParcelableがあります。
後はどのタイミングで呼ばれるかですが、呼ばれる順番はonparseのすぐ後になります。
onparse->onSaveInstanceState->onDestroy->onCreate(新しいactivity作成)
と覚えていれば問題ないと思います。
次に保存した値をどうやって復元するかですが、onSaveInstanceStateで保存した値は
onCreate内でgetStringやgetIntしてメンバ変数に入れるだけで再利用することができます。
</pre> //onCreate内 if (null != savedInstanceState) { mName = savedInstanceState.getBoolean("str"); mAge = savedInstanceState.getInt("int"); } <pre>
若しくはonRestoreInstanceStateを使って復元するか
</pre> @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mName = savedInstanceState.getBoolean("str"); mAge = savedInstanceState.getInt("int"); } <pre>
注意点ですが、画像などのデータ量が大きいものを保存しようとすると
android.os.TransactionTooLargeException: data parcel size 32445533 bytesと
エラーを受けるので、どうしても再利用したい場合は必ずデータ量を小さくしたり
Uriのまま保存することをおすすめします。