1、完整的Activity生命周期
包括onCreate() -> onStart() -> onResume() -> onPause() -> onStop -> onDestroy()
- 各方法作用:其中onCreate()负责组件创建及初始化,onStart()负责组件可见,onResume()负责获得焦点,相对应的onPause()负责失去焦点,onStop()负责组件不可见,onDestroy()负责销毁组件
- 开启:开启页面默认使用onCreate() -> onStart() -> onResume(),即组件状态默认可见可交互
- 获取与失去焦点:当可见不可交互,如弹窗、锁屏时,只会调用onPause()方法,相应的关闭弹窗或解锁时,会调用onResume()方法,使组件重新获得焦点,可交互
- 可见于不可见:当状态变为不可交互也不可见时,则会依次调用onPause() -> onStop(),当组件重新被打开且可交互,依次调用onRestart() -> onStart() -> onResume()方法
- 销毁:在生命周期任何状态下销毁Activity,都会以最便捷的路径依次调用方法至onDestroy(),终结Activity的生命周期
2、横竖屏切换
-
切换横屏:
- onSaveInstanceState -> onPause -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
-
切换竖屏:
- onSaveInstanceState -> onPause -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume -> onSaveInstanceState -> onPause -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
-
切换屏要避免activity生命周期重启需要设置activity属性android:configChanges="orientation|keyboardHidden|screenSize"
- android4.0之前只用设置android:configChanges="orientation|keyboardHidden"就可,4.0之后需要添加一个screenSize
3、拓展:
3.1 onSaveInstanceState():保存实例状态
调用情况:
- 当用户按下HOME键时。这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
- 长按HOME键,选择运行其他的程序时。
- 按下电源按键(关闭屏幕显示)时。
- 从activity A中启动一个新的activity时。
- 屏幕方向切换时,例如从竖屏切换到横屏时。