想搞懂 Jetpack 架构可以不搞懂生命周期知识吗?,阿里 P8 架构师
状态管理:
当 Activity 进入 Stopped 状态,系统使用 onSaveInstanceState 保存 app 状态,以防系统将 app 进程杀死,重启后恢复状态。
====================================================================================
触发步骤:
Configuration 发生改变, 比如旋转屏幕
用户在多窗口模式下调整窗口大小
当用户旋转屏幕,系统会保留旋转之前的状态,能很好的恢复到之前的状态。调用顺序如图:
状态管理:
Activity 被完全销毁掉,但是状态会被保存,而且会在新的 Activity 中恢复该状态
onCreate 和 onRestoreInstanceState 方法中的 bundle 是一样的
========================================================================================
触发步骤:
在 API 24+上开启多窗口模式失去焦点时
其它应用部分遮盖当前 APP,比如弹出权限授权 dialog
弹出 intent 选择器时,比如弹出系统的分享 dialog
该场景不适用于以下情况:
相同 APP 中弹 dialog,比如弹出 AlertDialog 或者 DialogFragment 不会导致 Activity onPause 发生调用
系统通知。当用户下拉系统通知栏时,不会导致下面的 Activity onPause 发生调用。
===================================================================================
触发步骤:
activity1 跳转到 activity2
按返回按钮
注意:activity1 跳转到 activity2 正确的调用顺序是
->activity1.onPause
->activity2.onCreate
->activity2.onStart
->activity2.onResume
->activity1.onStop
->activity1.onSaveInstanceState
在该场景下,当新的 activity 启动时,activity1 处于 STOPPED 状态下(但是没有被销毁),这与用户按 Home 键有点类似。当用户按返回按钮时,activity2 被销毁掉。
状态管理:
onSaveInstanceState 会被调用,但是 onRestoreInstanceState 不会。当 activity2 展示在前台时,如果发生了旋转屏幕,当 activity1 再次获得焦点时,它将会被销毁并且重建,这就是为什么 activity1 在失去焦点时为什么需要保存状态。
如果系统杀死了 app 进程,该场景后面会介绍到
==========================================================================================
activity1 跳转到 activity2
在 activity2 上旋转屏幕
按返回按钮
![](https://img-blog.csdnimg.cn/img_convert/3
797d5d5bfaebac165c7d2c81bb6a163.png)
注意: 当返回 activity1 时,必须保证屏幕是保持旋转后的状态,否则并不会调用 onDestroy 方法。而且是在 activity1 回到前台时才会主动掉 onDestroy
状态管理:
保存状态对所有的 activity 都非常重要,不仅仅是对前台 activity。所有在后台栈中的 activity 在 configuration 发生改变时重建 UI 时都需要将保存的状态恢复回来。
评论