当我们按下home键,或者旋转屏幕之后再打开该程序的时候,往往需要保存上次打开时的状态.
为了实现这个目的,我们可以通过覆盖Activity.onSaveInstanceState(Bundle)的方式来实现
之前你已见过这样的Bundle。如下列代码所示,它作为参数被传入onCreate(Bundle?):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
}
覆盖onCreate(Bundle?)函数时,实际是在调用activity超类的onCreate(Bundle?)函数,并传入收到的bundle。在超类代码实现里,通过取出保存的视图状态数据,activity的视图层级结构得以重建。
可通过覆盖onSaveInstanceState(Bundle)函数将一些数据保存在bundle中,然后onCreate(Bundle?)函数中取回这些数据。处理设备旋转问题时,将采用这种方式保存currentIndex变量值
例:
private const val TAG = "MainActivity"
private const val KEY_INDEX = "index"
class MainActivity : AppCompatActivity() {
...
----------
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate(Bundle?) called")
setContentView(R.layout.activity_main)
val currentIndex = savedInstanceState?.getInt(KEY_INDEX, 0) ?: 0
quizViewModel.currentIndex = currentIndex
...
}
----------
override fun onPause() {
...
}
----------
override fun onSaveInstanceState(savedInstanceState: Bundle) {
super.onSaveInstanceState(savedInstanceState)
Log.i(TAG, "onSaveInstanceState")
savedInstanceState.putInt(KEY_INDEX, quizViewModel.currentIndex)
}
----------
override fun onStop() {
...
}
}
onCreate(Bundle?)函数中确认是否成功获取该数值。如果获取成功,就将它赋值给变量currentIndex;如果bundle里不存在index键对应的值,或者Bundle对象是null,就将currentIndex的值设为0
**应用activity或进程被销毁后,保存在onSaveInstanceState(Bundle)中的数据该如何幸免于难呢?调用该函数时,用户数据随即被保存到Bundle对象中,然后操作系统将这个Bundle对象放入activity记录中。
为便于理解activity记录,我们增加一个暂存状态(stashed state)到activity生命周期,如图所示。
**
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。