Android系统的回收机制会在未经用户主动操作的情况下销毁activity,而为了避免系统回收activity导致数据丢失,Android为我们提供了onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)用于保存和恢复数据。

答案是当activity有可能被系统回收的情况下,而且是在onStop()之前。注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法销毁activity,则onSaveInstanceState不会被调用。
或者也可以说,此方法只有在activity被异常终止的情况下会被调用。

总结下,onSaveInstanceState(Bundle outState)会在以下情况被调用:
1、当用户按下HOME键时。
2、从最近应用中选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从当前activity启动一个新的activity时。
5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。

在前4种情况下,当前activity的生命周期为:
onPause -> onSaveInstanceState -> onStop。

onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。

比如第5种情况屏幕方向切换时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在这里onRestoreInstanceState被调用,是因为屏幕切换时原来的activity确实被系统回收了,又重新创建了一个新的activity。

而按HOME键返回桌面,又马上点击应用图标回到原来页面时,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因为activity没有被系统回收,因此onRestoreInstanceState没有被调用。

如果onRestoreInstanceState被调用了,则页面必然被回收过,则onSaveInstanceState必然被调用过。

使用方法:附上代码

 private var INSANCE: String = "instance"    private var INSANCE_isfinsh: String = "isfinsh"    private var INSANCE_Whitepoints: String = "mWhitepoints"    private var INSANCE_Blackpoints: String = "mBlackpoints"    private var INSANCE_IsBlackWin: String = "mIsBlackWin"    private var INSANCE_IsWhiteWin: String = " mIsWhiteWin"    override fun onSaveInstanceState(): Parcelable? {        var bundle: Bundle = Bundle()        bundle.putParcelable(INSANCE, super.onSaveInstanceState())        bundle.putBoolean(INSANCE_isfinsh, isfinsh)        bundle.putParcelableArrayList(INSANCE_Whitepoints, mWhitepoints)        bundle.putParcelableArrayList(INSANCE_Blackpoints, mBlackpoints)        bundle.putBoolean(INSANCE_IsBlackWin, mIsBlackWin)        bundle.putBoolean(INSANCE_IsWhiteWin, mIsWhiteWin)        return bundle    }    override fun onRestoreInstanceState(state: Parcelable?) {        if (state is Bundle) {            var bundle: Bundle = Bundle(state)            isfinsh = bundle.getBoolean(INSANCE_isfinsh)            mWhitepoints = bundle.getParcelableArrayList(INSANCE_Whitepoints)!!            mBlackpoints = bundle.getParcelableArrayList(INSANCE_Blackpoints)!!            mIsBlackWin = bundle.getBoolean(INSANCE_IsBlackWin)            mIsWhiteWin = bundle.getBoolean(INSANCE_IsWhiteWin)            super.onRestoreInstanceState(bundle.getParcelable(INSANCE))            return        }        super.onRestoreInstanceState(state)    }

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android中dispatchDraw分析
  3. Android四大基本组件介绍与生命周期
  4. Android(安卓)Service AIDL
  5. Android调用天气预报的WebService简单例子
  6. android打电话发短信
  7. android 拨打紧急号码,通话时开启免提功能实现
  8. Android调用.NET Webservice报org.ksoap2.serialization.SoapPri
  9. Action for BroadcastReceiver's method

随机推荐

  1. C#中default什么意思
  2. php与c语言有什么联系和区别?
  3. c#怎么学
  4. 精通c语言能做什么
  5. 学好c语言可以干什么?
  6. 初学c语言用什么软件
  7. 现在学c语言用什么软件
  8. 怎么精通C语言?
  9. c反射和序列化是什么
  10. c#用什么软件编程?