Android

画面を縦から横にしたとき Activity 内のデータを保持する

リソース変更に伴いアクティビティを破棄して最初から作り直す。これは onCreate() が再び呼び出されてしまうから。画面を縦から横にするとビデオが最初から再生されるのもこのため。

データを保持するためにはどうするのか?

Activity で onRetainNonConfigurationInstance() を実装する。

@Override
public Object onRetainNonConfigurationInstance() {
	final KeepInfo data = new KeepInfo(hoge, fuga);
	return data;
}
package ms.creator.android.hoge;
public class KeepInfo {
	public String hoge;
	public int fuga;
	public KeepInfo(String hoge, int fuga){
		this.hoge = hoge;
		this.fuga = fuga;
	}
}


その情報を復元するには、getLastNonConfigurationInstance() を使用する。

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	final KeepInfo data = (KeepInfo) getLastNonConfigurationInstance();
	if (data == null) {
	} else {
		Log.v("hoge", String.valueOf(data.hoge));
		Log.v("fuga", String.valueOf(data.fuga));
	}
}

現在のインテントや実行中のスレッドの参照なども含め、何でも維持することができる。

注意なのは、Drawable、Adapter、View、Context に関連付いている Activity に関係のあるオブジェクトは渡してはいけないこと。
これをしてしまうとリソースがメモリリークしてしまうみたい。


参考
3.3 実行時の変化への対処 - ソフトウェア技術ドキュメントを勝手に翻訳
http://www.techdoctranslator.com/android/guide/resources/runtime-changes