当前位置: 首页 > news >正文

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,通过事务替换并加入返回栈)
初始状态(按步骤打开):
  1. 启动应用,显示 SplashActivity,Activity 运行栈:[SplashActivity]
  2. 3 秒后自动跳转至 MainActivity,Activity 运行栈:[SplashActivity, MainActivity]
  3. MainActivity 初始化时,通过 supportFragmentManager 加载 HomeFragment(无事务入栈),Fragment 返回栈:[]
  4. 点击“分类”按钮,执行事务:replace(HomeFragment → CategoryFragment)addToBackStack(null),Fragment 返回栈:[Home→Category 的事务]
  5. 点击“购物车”按钮,执行事务: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”的优先级:

  1. 若当前 Activity 的 Fragment 返回栈非空,优先回滚最近的 Fragment 事务(恢复到上一个 Fragment 状态)。
  2. 若 Fragment 返回栈为空,再处理 Activity 运行栈,销毁当前 Activity 并返回上一个 Activity。

这种机制让用户在单个 Activity 内的 Fragment 切换(如“首页→分类→购物车”)和跨 Activity 的跳转(如“启动页→主页”)之间获得连贯的导航体验,既支持局部页面切换的回退,也支持整体页面跳转的返回。

http://www.lryc.cn/news/604977.html

相关文章:

  • 基于SpringBoot+MyBatis+MySQL+VUE实现的便利店信息管理系统(附源码+数据库+毕业论文+远程部署)
  • 如何不让android studio自动换行
  • AI服务器中,EEPROM有哪些部件使用,需要存储哪些信息?
  • NLU 语义解析评测实践:基于函数调用的 ACC、ROUGE 与 BLEU 综合指标
  • 《SAM:Segment Anything》论文精读笔记
  • 《CLIP改进工作串讲》论文精读笔记
  • AtCoder Beginner Contest 416(ABCDE)
  • 机器视觉halcon7-缺陷检测
  • 「源力觉醒 创作者计划」_文心大模型 4.5 开源 28 天:从车间轴承到山村课堂的 AI 突围
  • 数据结构-Set集合(一)Set集合介绍、优缺点
  • labview控制软件开发
  • 多模通信·数据采集:AORO P9000U三防平板带来定制化解决方案
  • Kafka 单机多 Broker 实例集群搭建 | 详情
  • 【力扣热题100】哈希——最长连续序列
  • 中国高铁从追赶到领跑的破壁之路
  • Ubuntu 本地部署和使用 n8n 指南and ai almost anything
  • 《Java 程序设计》第 10 章 - 接口与 Lambda 表达式
  • 锁定中科院1区TOP!融合LSTM与Attention做时间序列预测 !
  • 新手向:DeepSeek 部署中的常见问题及解决方案
  • 【OD机试题解法笔记】符号运算
  • [特殊字符] 征服CPU的艺术:Rust多进程编程实战指南
  • AI绘画模型生成 MZ 日系美感人像/极致cos
  • 拥抱智慧物流时代:数字孪生技术的应用与前景
  • 小红书笔记详情API指南
  • VS调试前端项目时老是弹出Chrome无法更新的提示
  • Gitee Wiki重塑关键领域软件开发的知识管理范式
  • makefile中include *.d文件的作用
  • Git 中复原 revert 和重设 reset 有什么区别?
  • 认识ansible(入门)
  • uni-app,uni.navigateTo