Activity的生命周期
特殊的生命周期执行路径,一般分两种,一种屏幕发生旋转。一种,configration发生了变化,例如:
先来看,屏幕旋转发生变化:
屏幕旋转,Activity一定会销毁后,重新实例化。这里,activity会走这样的流程:
Activity | Activity |
---|---|
⬇️ | ⬇️ |
发生意外情况(例如屏幕旋转) | |
⬇️ | ⬇️ |
onSaveInstanceState() | (重新创建)-> onCreate() |
⬇️ | ⬇️ |
onDestroy() | onRestoreInstanceState() |
流程1 屏幕发生旋转,activity的生命周期的变化
不信看log,代码中,仅仅打印了 onCreate, onStart, onResume, onRestoreInstanceState, onSaveInstanceState, onStop, onDestroy这几个方法:
日志-1
06-29 22:18:20.931 I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:20.948 I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254 I/--act: onPause -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254 I/--act: onSaveInstanceState -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254 I/--act: onStop -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.254 I/--act: onDestroy -->graphic.com.texiao.lifecycle.LifeCycleActivity@545c35c
06-29 22:18:25.301 I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@62ffd1d
06-29 22:18:25.305 I/--act: onRestoreInstanceState -->
06-29 22:18:25.305 I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@62ffd1d
上面这段日志,展示了,activity从启动,到屏幕发生旋转后的日志。可以看到首先,出现2个activity实例:
- LifeCycleActivity@545c35c
- LifeCycleActivity@62ffd1d
其次,执行了 onSaveInstanceState
, onRestoreInstanceState
。
注意:
onSaveInstanceState
在onPause
之后执行。这点要注意。- 视图控件,也有
onSaveInstanceState
方法,并且会被调用。所以数据得以保存。
加上configChange配置
系统的配置参数发生变化,也会调用Activity的生命周期方法:onConfigChanged()
。
屏幕旋转时,方向,屏幕尺寸
这两个值会发生变化。如果不希望 旋转时,actvity重建,可以在 manifest的该activity中设置:
android:configChanges="orientation"
如此,activity就不会重建。
配置参数有非常多种,我们常用的是 locale, orientation, keyboardHidden, screenSize, smallScreenSize。
- screenSize - 根targetSdkVersion有关,sdkVersion 在13以下屏幕旋转,会变化,13以上就不变了
- smallScreenSize - 和
screenSize
类似。
下面,我加上android:configChanges=“orientation|screenSize”
,再看看打印的log:
日志-2
06-29 23:02:45.187 I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:02:45.195 I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
其实,我旋转了2次,什么都没执行。
接着,我要给activity加上一个方法: onConfigChanges()
:
override fun onConfigurationChanged(newConfig: Configuration?) {
super.onConfigurationChanged(newConfig)
Log.i("--act","onConfigurationChanged->" + this@LifeCycleActivity)
}
然后,再旋转一下屏幕,看看发生了什么?
日志-3
06-29 23:07:18.765 I/--act: onCreate -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:07:18.776 I/--act: onResume -->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
06-29 23:07:21.413 I/--act: onConfigurationChanged->graphic.com.texiao.lifecycle.LifeCycleActivity@fb489e7
嗯,onConfigurationChanged
方法被执行了。
总结一下:
所以总结一下,就是:
- 没有设置
configChanges = "orientation|screenSize"
时:
从创建activity,屏幕旋转操作,会重建activity,执行方法 onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onRestoreInstanceState -> onResume ,参考日志-1
- 设置
configChanges = "orientation|screenSize"
时:
从创建activity,屏幕旋转,不会重建activity,执行方法:onCreate -> onResume -> onConfigrationChanged重复执行
。参考日志-2,日志-3
上面一段,基本参考任玉刚的《Android 开发艺术探索》一书自己写代码验证了一把。最后表扬一下:玉刚写书确实真牛逼。