1. nav_graph.xml 如何生成路由表 NavGraph

解析流程与原理

关键技术点:
  1. XML 解析

    • 使用 XmlResourceParser 解析 XML 文件

    • 遍历所有节点(<fragment><activity><navigation>等)

  2. Destination 创建

    • 根据标签名获取对应的 Navigator

    • 调用 Navigator.createDestination() 创建具体目标

    • 解析节点属性(id、label、arguments 等)

  3. NavGraph 构建

    • 维护节点树结构

    • 处理嵌套导航图(递归解析)

    • 建立 action 连接关系

核心源码解析:
// NavInflater.java
public NavGraph inflate(@XmlRes int graphResId) {// 获取XML解析器XmlResourceParser parser = mContext.getResources().getXml(graphResId);// 创建空导航图NavGraph graph = new NavGraph(this);while (parser.next() != XmlPullParser.END_DOCUMENT) {if (parser.getEventType() != XmlPullParser.START_TAG) continue;String tagName = parser.getName();// 获取对应标签的NavigatorNavigator navigator = mNavigatorProvider.getNavigator(tagName);// 创建DestinationNavDestination destination = navigator.createDestination();// 解析属性destination.onInflate(mContext, parser);if (destination instanceof NavGraph) {// 递归解析嵌套图inflateChildren(parser, (NavGraph)destination);}// 添加到导航图graph.addDestination(destination);}return graph;
}

2. startDestinationId 启动页加载机制

启动流程原理

关键实现细节:
  1. 启动时机

    • NavHostFragment 的 onCreate() 方法中初始化

    • 首次设置导航图时触发启动流程

  2. 导航执行

    • 通过 FragmentNavigator.navigate() 执行

    • 使用反射创建 Fragment 实例:

      final Fragment fragment = mFragmentManager.getFragmentFactory().instantiate(mContext.getClassLoader(), dest.getClassName());
  3. 事务处理

    • 使用 FragmentTransaction.replace() 替换容器内容

    • 提交事务后立即执行(commitNow()

源码关键路径:
// NavController.java
public void setGraph(@NavGraphRes int graphResId) {mGraph = mNavInflater.inflate(graphResId);onGraphCreated(); // 触发首次导航
}private void onGraphCreated() {if (mBackStack.isEmpty()) {// 导航到起始目标navigate(mGraph, mGraph.getStartDestination(), null, null);}
}// FragmentNavigator.java
public NavDestination navigate(...) {// 创建Fragment实例final Fragment frag = instantiateFragment(context, className, args);final FragmentTransaction ft = mFragmentManager.beginTransaction();// 执行替换操作ft.replace(mContainerId, frag);ft.commit();return destination;
}

3. Fragment 页面切换为何执行 onDestroyView

根本原因分析

设计原理:
  1. 默认行为

    • FragmentNavigator 使用 replace() 而非 show/hide

    • 替换操作会销毁上一个 Fragment 的视图

  2. 生命周期对比

    导航方式前Fragment生命周期新Fragment生命周期
    replace()onPause→onDestroyViewonCreateView→onResume
    show/hide()onPauseonResume
  3. 官方设计考量

    • 确保状态一致性

    • 避免视图叠加导致的潜在问题

    • 简化内存管理

性能影响:
  • 优点:严格的内存管理,避免泄露

  • 缺点

    • 视图重建开销(特别是复杂UI)

    • 状态保存/恢复复杂化

    • 影响转场动画流畅性

4. singleTop 失效问题深度解析

问题现象与原因

源码级分析:
// FragmentNavigator.java
public NavDestination navigate(...) {// 无单例模式检查逻辑!// 始终创建新实例final Fragment frag = instantiateFragment(...);// 始终执行replaceft.replace(mContainerId, frag);
}
与 Activity singleTop 对比:
特性Activity singleTopFragment "singleTop"
栈顶复用调用 onNewIntent()始终重建
生命周期无销毁/重建完整生命周期
实现机制框架原生支持Navigation 未实现
官方未修复原因:
  1. 架构限制

    • Fragment 无内置任务栈管理

    • 缺乏类似 onNewIntent() 的回调机制

  2. 状态一致性

    • 确保每次导航都传递新参数

    • 避免状态污染

  3. 设计选择

    • 优先保证导航行为一致性

    • 牺牲特殊场景优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911821.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911821.shtml
英文地址,请注明出处:http://en.pswp.cn/news/911821.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 应用权限管控流程

HarmonyOS 应用权限管控流程详解 一、权限管控概述 HarmonyOS 通过多层次的安全机制保护用户数据和系统资源&#xff0c;其中应用权限管控是核心组成部分。系统通过以下机制实现权限管控&#xff1a; 应用沙箱&#xff1a;每个应用运行在独立沙箱中&#xff0c;通过TokenID识…

Python训练营-Day33

import torch torch.cudaimport torch# 检查CUDA是否可用 if torch.cuda.is_available():print("CUDA可用&#xff01;")# 获取可用的CUDA设备数量device_count torch.cuda.device_count()print(f"可用的CUDA设备数量: {device_count}")# 获取当前使用的C…

【STM32】中断优先级管理 NVIC

这篇文章是对 Cortex-M3 内核中断系统 和 STM32F1 系列 NVIC(嵌套向量中断控制器) 的解析说明。我将从结构清晰、层次分明的角度,对 NVIC 中断优先级分组的概念和 STM32F103 的实际情况做一个系统性的总结与叙述。 参考资料: STM32F1xx官方资料:《STM32中文参考手册V10》…

Angular2--高级特性(TODO)

1 基础 关于Angular的基础部分&#xff0c;几个核心部分和框架&#xff0c;在之前都写过了。Angular1--Hello-CSDN博客 Angular的几个核心部分和框架&#xff1a; 模板就是组件中的template&#xff0c;对应MVC的V。 组件类就是Component类&#xff0c;对应对应MVC的C。 服…

pikachu靶场通关笔记44 SSRF关卡02-file_get_content(三种方法渗透)

目录 一、SSRF 1、简介 2、原理 二、file_get_contents函数 1、功能 2、参数 3、返回值 4、file_get_contents与SSRF 三、渗透实战 1、基本探测 2、http协议 &#xff08;1&#xff09;访问upload-labs靶场 &#xff08;2&#xff09;访问yijuhua.txt 3、file协议…

Android 控件 - EditText 的 Hint(Hint 基本用法、Hint 进阶用法、单独设置 Hint 的大小)

一、EditText 的 Hint 1、基本介绍 在 Android 开发中&#xff0c;EditText 的 Hint 用于显示提示文本 提示文本当用户没有输入任何内容时显示&#xff0c;输入内容后自动消失 2、基本使用 &#xff08;1&#xff09;在 XML 布局文件中设置 在 XML 布局文件中设置 Hint …

PostgreSQL(知识片):索引关联度indexCorrelation

索引关联度的绝对值越大&#xff0c;说明这个索引数据越好。绝对值最大为1。 首先我们创建一个表&#xff1a;tbl_corr&#xff0c;包含列&#xff1a;col、col_asc、col_desc、col_rand、data&#xff0c;col_asc存储顺序数据&#xff0c;col_desc存储降序数据&#xff0c;col…

React纯函数和hooks原理

纯函数 JS 若满足其下条件 &#xff0c;被称为纯函数 1。确定的输入一定产生确定的输出 2 不产生副作用 另外redux中的reducer也要求是纯函数 Fiber 架构和hooks原理 useRef 在组件的整个声明周期内保持不变 用法&#xff1a;1绑定dom元素 或者 绑定一个类组件 因为函数式…

养老专业实训室虚拟仿真建设方案:助力人才培养与教育教学革新

随着我国老龄化程度加深&#xff0c;养老服务行业人才需求激增。养老专业实训室虚拟仿真建设方案凭借虚拟仿真技术&#xff0c;为养老专业教育教学带来革新&#xff0c;对人才培养意义重大。点击获取实训室建设方案 一、构建多元化虚拟场景&#xff0c;丰富实践教学内容 模拟居…

LangChain 提示词工程:语法结构详解与完整实战指南

LangChain 提示词工程&#xff1a;语法结构详解与完整实战指南 我将为您系统性地解析 LangChain 中各类提示模板的核心语法结构&#xff0c;通过清晰展示语法与对应代码示例&#xff0c;帮助您彻底掌握提示工程的实现方法。所有示例均围绕报幕词生成场景展开。 在这里插入图片…

20250625解决在Ubuntu20.04.6LTS下编译RK3588的Android14出现cfg80211.ko的overriding问题

Z:\14TB\versions\rk3588-android14-FriendlyElec\mkcombinedroot\res\vendor_modules.load 【拿掉/删除这一项目&#xff01;】 cfg80211.ko 20250625解决在Ubuntu20.04.6LTS下编译RK3588的Android14出现cfg80211.ko的overriding问题 2025/6/25 20:20 缘起&#xff1a;本文针对…

在WSL下搭建JavaWeb: JDBC学习环境

在WSL下搭建JavaWeb: JDBC学习环境 前言 ​ 笔者最近打算放松一下&#xff0c;接触一点经典的Java Web技术&#xff0c;自己在闲暇时间时玩一玩JavaWeb技术。这里开一个小系列整理一下最近学习的东西&#xff0c;以供参考和学习。 ​ 笔者的计划是使用VSCode写代码&#xff…

pscc系统如何部署,怎么更安全更便捷?

磐石云PSCC系统的安全高效部署需结合云原生架构与零信任安全模型&#xff0c;以下是经过大型项目验证的部署方案及最佳实践&#xff1a; 一、智能部署架构&#xff08;混合云模式&#xff09; 二、安全增强部署方案 1. 基础设施安全 网络隔离 采用 三层网络分区&#xff1a;互…

协程驱动的高性能异步 HTTP 服务器:基础实现与任务调度机制

一、引言&#xff1a;为什么用协程实现 HTTP 服务器&#xff1f; 传统 HTTP 服务器的编程模型大致分为&#xff1a; 多线程阻塞型&#xff1a;每连接一线程&#xff0c;简洁但扩展性差 事件驱动模型&#xff08;如 epoll 状态机&#xff09;&#xff1a;高性能但逻辑复杂 回…

《视频:点亮数字时代的光影魔方》

视频的前世今生&#xff1a;从诞生到爆火 视频的发展历程是一部充满创新与变革的历史&#xff0c;它见证了科技的飞速进步和人类对信息传播与娱乐方式不断追求的过程。从早期的雏形到如今的全面普及&#xff0c;视频经历了多个重要阶段&#xff0c;每一个阶段都伴随着关键节点与…

秋招Day14 - MySQL - 运维

百万级别以上的数据如何删除&#xff1f; 这么大量的DELETE操作可能会导致长时间锁表 可以进行批量删除&#xff0c;把要删除的数据分为多个小批次处理。 也可以采用创建新表&#xff0c;把不需要删除的数据迁移过来&#xff0c;然后废弃旧表。需要检查新表空间是否足够、分…

(C++)vector数组相关基础用法(C++教程)(STL库基础教程)

源代码&#xff1a; #include <iostream> #include <vector> #include <string> using namespace std;int main(){char a;int b;int c;vector <char> numbers;cout<<"请输入一组字符&#xff08;按下#结束&#xff09;:\n";while(1){…

面试的问题

主题&#xff1a;LLM相关、多模态相关、python编程、java编程 参见&#xff1a;小红书面试相关的帖子 LLM相关&#xff1a; 02.大语言模型架构/1.attention/1.attention.md qzl66/llm_interview_note - Gitee.com 02.大语言模型架构/Transformer架构细节/Transformer架构细…

【EDA软件】【应用功能子模块网表提供和加载编译方法】

1.背景 使用者做FPGA应用开发&#xff0c;将开发成果交给自己的客户&#xff0c;但是并不想提供RTL源码以及加密的源码&#xff0c;只想提供网表文件。 2.方法 2.1 指定应用功能子模块设置为Top层&#xff1b; 2.2 运行综合&#xff0c;在outputs文件夹下会生成该应用功能子…

Spring:多数据源配置多个事务管理器DEMO

Spring配置文件&#xff1a; 配置2个事务管理器&#xff1a;txManager和txManager2 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLS…