文章目录
前言
android学习中,Activity是非常重要的一部分,接下来进行activity生命周期的讲解和具体的应用
一、activity生命周期
oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()-> onDestory()
onCreate()
:activity创建时调用,进行初始化布局的操作onStart()
:onCreate()
执行完之后执行,此时activity处于可见状态,但没有焦点,不可以交互onResume()
:此时activity处于前台,用户可见,可进行交互onPause()
:另一个activity覆盖当前activity时,调用onPause()
方法,此时activity仍处于可见状态,但不可以交互onStop()
:另一个activity完全覆盖当前activity,此时activity不可见onDestroy()
:此时activity从栈中移除,完全被销毁onRestart()
:activity重新回到前台时被调用
二、onSaveInstanceState(Bundle outState)
1.outState参数
起到数据保存作用,Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中
2.调用时机
- 从最近使用的应用程序中选择运行其他应用程序
- 当用户按下HOME键时
- 屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)
- 按下电源按键(关闭屏幕显示)时
- 从当前activity启动一个新的activity时
onPause() -> onSaveInstanceState() -> onStop()
3.注意事项
- 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法
- 布局中组件状态存储 : 每个组件都实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意,:只有有 id 的组件才会保存
三、onRestoreInstanceState(Bundle outState)
1.调用时机
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用,如果内存充足,系统没有销毁这个 Activity,就不需要调用
- 屏幕方向切换时生命周期调用(不做任何配置)
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState ->onResume
四、onNewIntent()
如果IntentActivity处于任务栈的顶端,也就是说之前打开过的Activity,现在处于onPause
、onStop
状态的话,其他应用再发送Intent的话,执行顺序为:onNewIntent
->onRestart
->onStart
->onResume
- 当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法
- 当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时再次启动会调用onNewIntent()方法
五、activity切换生命周期的变化
1、几种情况
1、当B Activity 的 launchMode 为 standard 或者 B Activity 没有可复用的实例时
Activity A跳转Activity B,再按返回键,生命周期执行的顺序
当A跳转到B的时候,A先执行
onPause
,然后是B再执行onCreate
->onStart
->onResume
,最后才执行A的onStop
当B按下返回键,B先执行
onPause
,然后是A再执行onRestart
->onStart
->onResume
,最后才是B执行onStop
->onDestroy
2、当 B Activity 的 launchMode 为 singleTop且 B Activity 已经在栈顶时,此时只有 B 页面自己有生命周期变化
B.onPause
->B.onNewIntent
->B.onResume
3、当 B Activity 的 launchMode 为 singleInstance,singleTask 且对应的 B Activity 有可复用的实例时
A.onPause
->B.onNewIntent
->B.onRestart
->B.onStart
->B.onResume
->A.onStop
-> ( 如果 A 被移出栈的话还有一个A.onDestory
)
2、dialog对生命周期的影响
1、弹一个普通的dialog
- 生命周期回调都是 AMS 通过
Binder
通知应用进程调用的;而弹出Dialog
、Toast
、PopupWindow
本质上都直接是通过WindowManager.addView
显示的(没有经过 AMS),所以不会对生命周期有任何影响
2、如果是启动一个 Theme 为 Dialog 的 Activity
- 生命周期为:
A.onPause
->B.onCreate
->B.onStart
->B.onResume
注意这边没有前一个 Activity 不会回调 onStop,因为只有在 Activity 切到后台不可见才会回调 onStop,而弹出 Dialog 主题的 Activity 时前一个页面还是可见的,只是失去了焦点而已所以仅有 onPause 回调
3、横竖屏切换
1、Android 3.2 (API 级别 13)以前
- 不设置Activity的
android:configChanges
时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 - 设置Activity的
android:configChanges="orientation"
时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 - 设置Activity的
android:configChanges="orientation|keyboardHidden"
时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged
方法
2、从 Android 3.2 (API级别 13)开始
- 不设置Activity的
android:configChanges
,或设置Activity的android:configChanges="orientation"
,或设置Activity的android:configChanges="orientation|keyboardHidden"
,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次 - 配置
android:configChanges="orientation|keyboardHidden|screenSize"
,才不会销毁 activity,且只调用 onConfigurationChanged方法
4、锁屏
锁屏时只会调用onPause()
,而不会调用onStop
方法,开屏后则调用onResume()
参考
https://www.jianshu.com/p/dbc7e81aead2
https://www.sohu.com/a/402329833_611601