簡単です。
Androidではバックグラウンドで動作されているときにアクティビティが勝手に停止されてしまうことがある。また画面の回転時にもアクティビティが再生成されてしまう(させない方法もあるが画面が再構成されないなどのデメリットもある)。そうするとメンバ変数やUI部品に入力されている内容などが破棄されてしまい初期化されてしまう。
そのためAndroidではいつでもアクティビティが破棄されていもいいような作り方が必要になる。そこでAndroidにはメンバ変数やUI部品に表示された内容を一時的に保存する仕組みがある。それが、onSaveInstanceStateとonRestoreInstanceStateである。
簡単なのでソースをみてもらえばわかると思う。
textViewに数字を表示させ、ボタンをクリックするたびに0から1ずつインクリメントしていく簡単なプログラムである。
通常では、画面回転時には数字は保存されず、必ず0からののスタートになるが、アクティビティ破棄時にデータを保存しているため画面を回転させても続きの数字で計算されていることがわかる。
なお、保存するデータは簡単な文字や数字などにしておかなければならないそうだ。大量のデータは他の手段で保存しよう。
そのためAndroidではいつでもアクティビティが破棄されていもいいような作り方が必要になる。そこでAndroidにはメンバ変数やUI部品に表示された内容を一時的に保存する仕組みがある。それが、onSaveInstanceStateとonRestoreInstanceStateである。
簡単なのでソースをみてもらえばわかると思う。
textViewに数字を表示させ、ボタンをクリックするたびに0から1ずつインクリメントしていく簡単なプログラムである。
通常では、画面回転時には数字は保存されず、必ず0からののスタートになるが、アクティビティ破棄時にデータを保存しているため画面を回転させても続きの数字で計算されていることがわかる。
なお、保存するデータは簡単な文字や数字などにしておかなければならないそうだ。大量のデータは他の手段で保存しよう。
class MainActivity : AppCompatActivity() {
//今回保存したい数値 ボタンクリックで+1される
private var mCount: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//初期表示
textView.text = "0"
//ボタンを押すたびに+1してtextViewに表示される
button.setOnClickListener {
textView.text = (++mCount).toString()
}
}
//アクティビティ破棄時に呼び出されるので、Bundleに対してデータを保存しておく
override fun onSaveInstanceState(outState: Bundle?) {
super.onSaveInstanceState(outState)
outState?.putInt("COUNT", mCount)
}
//データが保存されている時に呼ばれるのでデータを取得して表示をさせておく
//ここはデータを保存していないと呼ばれないので、初回表示時の初期化処理をしてはいけない
override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
super.onRestoreInstanceState(savedInstanceState)
mCount = savedInstanceState?.getInt("COUNT") ?: 0
textView.text = mCount.toString()
}
}