Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述:
请说明onSaveInstanceState(Bundle outState)和onRestoreInstanceState(BundlesavedInstanceState)这两个方法的调用时机?
二、思路分析:
先看Android开发者指南上的一段话:
Android calls onSaveInstanceState() before the activity becomes vulnerable to being destroyed by the system, but does not bother calling it when the instance is actually being destroyed by a user action (such as pressing the BACK key)
Android 在 Activity “容易”被系统销毁之前调用 onSaveInstanceState(),但在实例实际被用户操作(例如按下 BACK 键)销毁时不会调用它。
从上面这段话可以知道,首先可以确定,用户操作销毁时不会调用这个方法。但是前一句话,何为“容易”?
言下之意就是该activity还没有被销毁,而仅仅是出现一种被销毁的可能性的时候。
三、总结
onSaveInstanceState方法
总结一下,出现被销毁的可能性主要有:
-
当用户按下HOME键:这种情况下,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。
-
长按HOME键,选择运行其他的程序时。
-
按下电源按键(关闭屏幕显示)时。
-
从activity A中启动一个新的activity时。
-
屏幕方向切换时,例如从竖屏切换到横屏时。在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState一定会被执行。
总而言之,onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。
onRestoreInstanceState方法
This method is called after onStart when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState. This method is called between onStart and onPostCreate.
当活动从以前保存的状态重新初始化时,在 onStart 之后调用此方法,此处在 savedInstanceState 中给出。大多数实现将简单地使用 onCreate 来恢复它们的状态,但有时在完成所有初始化之后在此处执行此操作或允许子类决定是否使用您的默认实现会很方便。此方法的默认实现会恢复以前被 onSaveInstanceState 冻结的任何视图状态。此方法在 onStart 和 onPostCreate 之间调用。
注意:onSaveInstanceState方法和onRestoreInstanceState方法不一定是成对的被调用的,onRestoreInstanceState被调用的前提是,activity A确实被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行。
另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。