Android系统本身对Activity就有一些容错处理,这里就针对onSaveInstanceState()、onRestoreInstanceState()两个方法进行说明。
一、基本作用:
Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,比如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,Android系统认为用户的行为不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
在activity被杀掉之前调用保存每个实例的状态,以保证该状态可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该activity在将来某个时刻回来时可以恢复其先前状态。
例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
关于onSaveInstanceState (),是在函数里面保存一些View有用的数据到一个Parcelable对象并返回。在Activity的onSaveInstanceState(Bundle outState)中调用View的onSaveInstanceState (),返回Parcelable对象,接着用Bundle的putParcelable方法保存在Bundle savedInstanceState中。当系统调用Activity的的onRestoreInstanceState(Bundle savedInstanceState)时, 同过Bundle的getParcelable方法得到Parcelable对象,然后把该Parcelable对象传给View的onRestoreInstanceState (Parcelable state)。在的View的onRestoreInstanceState中从Parcelable读取保存的数据以便View使用。
二、onSaveInstanceState()函数的调用时机
根据Android的官方文档中的描述为:当某个activity“容易”被系统销毁的时候调用。注意这句话中的双引号,“容易”被销毁,这句话很可能被误解为当系统销毁我的activity时才会被调用,其实不是这样的,它的意思就是说该activity还没有被销毁,而仅仅是一种可能性。那么onSaveInstanceState()被调用的时机有哪些呢?总结如下:
(1)从activity A中启动一个新的activity B时。
(2)长按HOME键,选择运行其他的程序时。
(3)按下电源按键关闭屏幕显示时。
(4)屏幕方向切换时,例如从竖屏切换到横屏时。
(5)当用户按下HOME键时。
总而言之一句话就是:在系统未经你的许可就有要销毁在后台运行的你的activity的可能性时,onSaveInstanceState()函数就会被调用。如果activity确实被销毁了,那么onSaveInstanceState()函数会在onPause或者onStop之前调用。
三、onRestoreInstanceState()函数的调用时机
onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。如果onRestoreInstanceState()函数被调用了,那么它是在onStart与onResume之间调用。这里 有一点要注意就是:onRestoreInstanceState()和onSaveInstanceState()并不是一定会成对的调用。 例如用户按下HOME键回到主界面,在系统认为你有可能在未经你的允许下要销毁activity,这时onSaveInstanceState()函数被调用,这时用户又返回到activity,这种情况下activity 一般不会因为内存的原因被系统销毁,所以onRestoreInstanceState()不会被调用。
onRestoreInstanceState()函数与onSaveInstanceState ()函数的调用关系总结为:调用onSaveInstanceState ()函数一定会调用onRestoreInstanceState()函数,但是调用onRestoreInstanceState()函数,不定会调用onSaveInstanceState ()。
四、onSaveInstanceState()中父类函数的调用
如果你的activity是继承FragmentActivity,并且管理了很多fragment,如果你的activity未经你的允许销毁了activity,这个时候会调用onSaveInstanceState()函数,其中函数中会有super.onSaveInstanceState()这样一段调用父类函数的一个语句,如果执行了这段语句有时会导致你的多个fragment重叠的情况,因为默认时系统会调用父类函数去保存视图图层,这样有时会导致fragment重叠问题,所以需要将super.onSaveInstanceState()这句话删掉。