#onSaveInstanceState()
onSaveInstanceState()をoverrideして実装することで、インスタンスの状態を保存することができます。
このメソッドはonStop()の前に呼ばれます。
###メモリの破棄
Activityのライフサイクル上、**onDestroy()**が呼ばれると全てのリソースが開放され、メモリも破棄されてしまいます。
そのため、改めてActivityを生成しても以前の状態は保持できません。
###情報の保存
以前の状態を保つために、Bundleオブジェクトに必要なデータを保存しておき、Activityが再び生成される際に、そのデータを取り出すことができます。
##使い方
###onSaveInstanceState()
companion object {
const val STATE_INDEX = "index"
}
override fun onSaveInstanceState(outState: Bundle?) {
outState?.putInt(STATE_INDEX, 1)
super.onSaveInstanceState(outState)
}
Key-Valueの構造になっているBundleに保存することができます。
ここではInt型のものを保存しています。
ただしValueの型の種類には制限があり、基本的なものしか適応できません。
###onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("LifecycleActivity", "onCreate(Bundle) called")
if (savedInstanceState != null) {
Log.d("LifecycleActivity", savedInstanceState.getInt(STATE_INDEX).toString())
}
setContentView(R.layout.activity_lifecycle)
}
onCreate()でsavedInstanceStateから保存したデータを取り出すことができます。
D/LifecycleActivity: onCreate(Bundle) called
D/LifecycleActivity: 1
ただしsavedInstanceStateに何も入っていない場合はnullであるため、取り出し方には注意してください。
#回転問題
スマートフォンを傾けたときに、画面を回転させることができます。
そのときのActivityは実は一度破棄されて、再生成されています。
D/LifecycleActivity: onPause() called
D/LifecycleActivity: onStop() called
D/LifecycleActivity: onDestroy() called
D/LifecycleActivity: onCreate(Bundle) called
D/LifecycleActivity: onStart() called
D/LifecycleActivity: onResume() called
そのため、画面が回転したときも状態を残しておけるように、**onSaveInstanceState()**メソッドを活用する必要がでてきます。
#その他
Activityが明示的に破棄されずとも、停止状態や一時停止状態の時でも、OSの判断によりメモリが破棄されることがあります。
そのときも残しておきたい情報は保存しておくことが必要です。
#参考文献
Understand the Activity Lifecycle
Android Programming: The Big Nerd Ranch Guide (3rd Edition) (Big Nerd Ranch Guides)