FragmentManager 返回栈与 Activity 运行栈的关系(当按下Back键时屏幕会如何变化?)
FragmentManager 返回栈与 Activity 运行栈的关系
在不考虑 Fragment 内部嵌套(即子 Fragment 返回栈)的情况下,FragmentManager 返回栈(以下简称“Fragment 返回栈”)与 Activity 运行栈是两个独立但存在交互的栈结构,分别管理 Fragment 事务和 Activity 实例的生命周期,共同决定 Back 键触发时的屏幕变化。
一、两个栈的核心定义与区别
特性 | Fragment 返回栈 | Activity 运行栈 |
---|---|---|
管理对象 | 记录对“顶级 Fragment”(直接添加到 Activity 的 Fragment)的事务历史(如 replace /add 操作)。 | 记录应用中 Activity 的启动顺序,每个“任务”对应一个栈。 |
所属主体 | 由 Activity 的 supportFragmentManager 管理,仅属于当前 Activity。 | 由 Android 系统管理,属于整个应用(或跨应用的任务)。 |
作用 | 支持 Fragment 事务的回滚(如按 Back 键恢复到上一个 Fragment 状态)。 | 支持 Activity 的返回导航(如按 Back 键关闭当前 Activity,回到上一个)。 |
操作粒度 | 仅影响当前 Activity 内部的 Fragment 显示状态。 | 影响整个应用的页面跳转(Activity 切换)。 |
二、两者的层级关系
Fragment 返回栈是依附于 Activity 运行栈的“子结构”:
- 一个 Activity 运行栈包含多个 Activity,每个 Activity 独立运行。
- 每个 Activity 内部有一个 Fragment 返回栈,管理该 Activity 中的顶级 Fragment 事务。
- 两者遵循“先内后外”的交互规则:Back 键优先处理当前 Activity 的 Fragment 返回栈,再处理 Activity 运行栈。
三、实际场景:Back 键触发时的屏幕变化
以“电商应用”为例,场景结构如下:
SplashActivity(启动页,Activity 运行栈初始状态)
↓
MainActivity(主页,包含 Fragment 返回栈,初始显示 HomeFragment)├─ HomeFragment(首页 Fragment,无事务入栈)├─ CategoryFragment(分类 Fragment,通过事务替换并加入返回栈)└─ CartFragment(购物车 Fragment,通过事务替换并加入返回栈)
初始状态(按步骤打开):
- 启动应用,显示
SplashActivity
,Activity 运行栈:[SplashActivity]
。 - 3 秒后自动跳转至
MainActivity
,Activity 运行栈:[SplashActivity, MainActivity]
。 MainActivity
初始化时,通过supportFragmentManager
加载HomeFragment
(无事务入栈),Fragment 返回栈:[]
。- 点击“分类”按钮,执行事务:
replace(HomeFragment → CategoryFragment)
并addToBackStack(null)
,Fragment 返回栈:[Home→Category 的事务]
。 - 点击“购物车”按钮,执行事务:
replace(CategoryFragment → CartFragment)
并addToBackStack(null)
,Fragment 返回栈:[Home→Category 的事务, Category→Cart 的事务]
。
按 Back 键的变化过程:
第 1 次按 Back 键:
- 系统优先检查当前 Activity(
MainActivity
)的 Fragment 返回栈,发现栈顶是“Category→Cart 的事务”。 - 回滚该事务:销毁
CartFragment
,重建CategoryFragment
。 - Fragment 返回栈变为:
[Home→Category 的事务]
。 - 屏幕显示:从
CartFragment
回到CategoryFragment
。
第 2 次按 Back 键:
- Fragment 返回栈非空,栈顶是“Home→Category 的事务”。
- 回滚该事务:销毁
CategoryFragment
,重建HomeFragment
。 - Fragment 返回栈变为空:
[]
。 - 屏幕显示:从
CategoryFragment
回到HomeFragment
。
第 3 次按 Back 键:
- Fragment 返回栈为空,系统转向处理 Activity 运行栈,当前栈顶是
MainActivity
。 - 系统销毁
MainActivity
,Activity 运行栈变为:[SplashActivity]
。 - 屏幕显示:回到
SplashActivity
。
第 4 次按 Back 键:
- Activity 运行栈仅剩
SplashActivity
,系统销毁它,栈变为空。 - 屏幕显示:退出应用,回到手机桌面。
四、核心规则总结
在不考虑子 Fragment 的情况下,Back 键的处理逻辑遵循“先 Fragment 后 Activity”的优先级:
- 若当前 Activity 的 Fragment 返回栈非空,优先回滚最近的 Fragment 事务(恢复到上一个 Fragment 状态)。
- 若 Fragment 返回栈为空,再处理 Activity 运行栈,销毁当前 Activity 并返回上一个 Activity。
这种机制让用户在单个 Activity 内的 Fragment 切换(如“首页→分类→购物车”)和跨 Activity 的跳转(如“启动页→主页”)之间获得连贯的导航体验,既支持局部页面切换的回退,也支持整体页面跳转的返回。