当前位置: 首页 > 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.dtcms.com/a/306242.html

相关文章:

  • kali Linux 2025.2安装教程(解决安装失败-图文教程超详细)
  • GitPython03-项目setup编译
  • Spring boot 打包成docker image 镜像
  • forge篇——配置
  • DevOps 实践指南:Git 版本控制从入门到精通
  • 以rebase 方式merge , git要怎么实现两个分支以rebase 合并
  • LLM gateway
  • Kong API Gateway深度解析:插件系统与微服务架构的技术基石
  • LabVIEW DSC报警Web服务客户端
  • labview控制软件开发
  • 量子图灵机 Quantum Turing Machine, QTM
  • Spring Boot音乐服务器项目-查询喜欢的音乐模块
  • Java Ai While 和Do While 循环 day (08)
  • Radash: 新一代前端工具库取代替换Lodash库
  • 【开发技术】.Net中配置Serilog日志分级记录
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘dash’问题
  • Python爬虫实战:研究python-readability库相关技术构建网页内容提取系统
  • sqli-labs:Less-6关卡详细解析
  • nodejs项目中常用的npm包及分类
  • 个人如何做股指期货?
  • 高职工业数据采集与边缘服务应用实训室解决方案
  • npm run dev 启动项目 报Error: listen EACCES: permission denied 0.0.0.0:80 解决方法
  • NPM组件 @0xme5war/apicli 等窃取主机敏感信息
  • vue create 项目名 和 npm init vue@latest 创建vue项目的不同
  • Vue2-封装一个看起来像左右分布表格的表单组件
  • python基础:用户输入和 while 循环
  • 学习日志22 python
  • 2024 年 NOI 最后一题题解
  • 从0到1学PHP(八):PHP 与 MySQL 数据库:数据持久化存储
  • Spring AI 海运管理应用第2部分