熟悉安卓界面的小伙伴们应该都知道activity的生命周期,分别是onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart,我们今天主要是来一起看看常见场景下activity生命周期的调用流程。以android12 api31的手机为例
场景1:正常界面的启动
onCreate -> onStart -> onResume
场景2:先从A界面跳转到B界面
A onPause -> B onCreate -> B onStart -> B onResume -> A onStop -> A onSaveInstanceState
再从B界面返回到A界面
B onPause -> A onRestart -> A onStart -> A onResume -> B onStop -> B onDestroy
场景3:当前界面按下锁屏键
onPause -> onStop -> onSaveInstanceState
再打开屏幕
onRestart -> onStart -> onResume
场景4:当前界面按下HOME键
onPause -> onStop -> onSaveInstanceState
再点击任务键或桌面直接打开此应用
onRestart -> onStart -> onResume
场景5:当前界面按下任务菜单键
onPause -> onStop -> onSaveInstanceState
再点击清除杀掉此进程
什么周期也没走
场景6:当前界面按下任务菜单键
onPause -> onStop -> onSaveInstanceState
然后点击应用再次进入
onRestart -> onStart -> onResume
场景7:横竖屏切换(未配置configChanges)
onPause -> onStop -> onSaveInstanceState -> onDestroy -> onCreate(savedInstanceState不为空) -> onStart -> onRestoreInstanceState -> onResume
场景8:横竖屏切换(配置configChanges="orientation|screenSize")
onConfigurationChanged
注:
1.横竖屏切换一些注意事项:
Activity的AndroidManifest.xml中设置android:configChanges
1)不添加configChanges = orientation = keyboardHidden = screenSize = orientation|keyboardHidden = keyboardHidden|screenSize,切换横竖屏过程中生命周期是相同的
2)orientation|screenSize,横竖屏切换不不会重新调用各个生命周期,只会执行onConfigurationChanged方法
3)自从Android3.2(API13), 在设置Activity的 android:configChanges="orientation |keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screensize也开始跟着设备的横竖切换而改变。
4)Android3.2(API13)之前:
(1)不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
(2)设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
(3)设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
2.onSaveInstanceState方法
在某种时机下,Activity会调用onSaveInstanceState方法通过保存Bundle参数来保存当前的Activity的数据。onSaveInstanceState方法总是会在onStop后调用。
发生以下等情况会被调用:
按下HOME键切到后台时
锁屏时(按下电源键或自动锁屏)
从该Activity中启动一个新的Activity时
横竖屏切换时 (前提是Activity的configChanges属性配置了orientation)
3.onRestoreInstanceState方法
当Activity被重新创建(横竖屏切换,或者被系统强杀重启后的重新创建)之后就会调用onRestoreInstanceState,而它的Bundle参数,就是onSaveInstanceState方法保存的。onRestoreInstanceState这个方法会在onStart后调用。
发生以下等情况会被调用:
Activity在后台的情况下,被系统强杀了,再次打开Activity时
横竖屏切换时 (会走activity生命周期的情况)