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

万维网的网站互联网培训

万维网的网站,互联网培训,凡科建设网站靠谱吗,杭州公司网站建设电话1. nav_graph.xml 如何生成路由表 NavGraph 解析流程与原理 关键技术点&#xff1a; XML 解析&#xff1a; 使用 XmlResourceParser 解析 XML 文件 遍历所有节点&#xff08;<fragment>, <activity>, <navigation>等&#xff09; Destination 创建&#…

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.dtcms.com/wzjs/462676.html

相关文章:

  • 网站开发cms热门关键词查询
  • 微信小程序公众平台浙江seo公司
  • 2014个人网站备案如何让网站被百度收录
  • 做牛仔裤的小视频网站win10优化软件
  • 网站平台做期货产品市场推广方案范文
  • wordpress菜单html5湖南正规关键词优化报价
  • 凡客诚品首页htmlseo管家
  • 做视频网站需要执照吗今日国内重大新闻
  • 公司图案设计百合seo培训
  • 网站关键词库是怎么做的网站seo优化建议
  • 国内老牌的广州网站建设关键词优化骗局
  • 网站设计的主要内容windows优化大师怎么样
  • php做网站技术方案seo百度快照优化公司
  • 北京市网站建设 维护推荐百度站长平台怎么用
  • 做设计什么兼职网站网上打广告有哪些软件
  • 怎么进入微信官方网站国内最新新闻摘抄
  • DW做旅游网站毕业设计模板seo系统优化
  • 东莞网站建设培训学校seo手机端排名软件
  • 人力招聘网站建设目的seo网站诊断
  • 产品网站建设多少钱如何做网站的教程
  • 网站的结构类型免费创建网站
  • php网站开发的第三章怎么制作自己公司网站
  • 重庆手机版建站系统信息爱链接购买链接
  • 贵阳建设工程信息网站免费私人网站建设
  • 自己做网站的软件如何被百度收录
  • 买房子上哪个网站最好长春网络科技公司排名
  • 温岭自适应网站建设百度客服电话24小时客服电话
  • 设计师必去的网站关键词快速排名平台
  • 机械配件网站建设竞价推广开户公司
  • 菏泽网站建设公司太原竞价托管公司推荐