用户触发和系统触发的不同事件会导致 Activity 从一个状态转换到另一个状态.
1. 配置发生了更改
横屏和竖屏之间的屏幕方向变化;
语言或输入设备的改变等
当配置发生更改时,Activity 会被销毁并重新创建。
原始 Activity 实例将触发 onPause()、onStop() 和 onDestroy() 回调。
系统将创建新的 Activity 实例,
并触发 onCreate()、onStart() 和 onResume() 回调。
结合使用 ViewModels、onSaveInstanceState() 方法和/或持久性本地存储,
可使 Activity 的界面状态在配置发生更改后保持不变
1.1 处理多窗口模式的情况
在多窗口模式下,虽然用户可以看到两个应用,
但只有与用户交互的应用位于前台且具有焦点。
该 Activity 处于“已恢复”状态,而另一个窗口中的应用则处于“已暂停”状态。
2. Activity 或对话框显示在前台
(1)如果有新的 Activity 或对话框出现在前台,并且局部覆盖了正在进行的 Activity,
则被覆盖的 Activity 会失去焦点并进入“已暂停”状态。
然后,系统会调用 onPause()。
当被覆盖的 Activity 返回到前台并重新获得焦点时,会调用 onResume()。
(2)如果有新的 Activity 或对话框出现在前台,夺取了焦点且完全覆盖了正在进行的 Activity,
则被覆盖的 Activity 会失去焦点并进入“已停止”状态。
然后,系统会快速地接连调用 onPause() 和 onStop()。
3.用户点按“返回”按钮
如果 Activity 位于前台,并且用户点按了返回按钮,Activity 将依次经历 onPause()、onStop() 和 onDestroy() 回调。
活动不仅会被销毁,还会从返回堆栈中移除。
需要注意的是,在这种情况下,默认不会触发 onSaveInstanceState() 回调。
此行为基于的假设是,用户点按返回按钮时不期望返回 Activity 的同一实例。
不过,可以通过替换 onBackPressed() 方法实现某种自定义行为,例如“确认退出”对话框。
如果替换 onBackPressed() 方法,我们仍然强烈建议您从被替换的方法调用 super.onBackPressed()。
否则,返回按钮的行为可能会让用户感觉突兀。
4. 系统终止应用进程
如果某个应用处于后台 并且系统需要为前台应用 释放额外的内存,
则系统可能会 终止后台应用 以释放 更多内存
参考:
https://developer.android.google.cn/guide/components/activities/state-changes#cco
网友评论