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

(2)从源码角度聊聊Jetpack Navigator的工作流程

Jetpack Navigation 的工作流程涉及多个核心类和复杂的交互,以下是从源码角度对其主要工作流程的分析:

一、初始化阶段

  1. NavHostFragment的创建:

    • 当在布局文件中使用<androidx.fragment.app.FragmentContainerView android:name="androidx.navigation.fragment.NavHostFragment"/>时,系统会实例化NavHostFragment。这个类是NavHost的具体实现,它负责管理导航图中的各个片段(Fragment)的显示和切换。
    • NavHostFragmentonCreate方法中,会初始化一些重要的成员变量,如NavControllerLifecycleOwner等。
  2. NavController的获取:

    • NavHostFragment通过findNavController()方法获取NavController实例。这个方法会遍历视图层次结构,查找最近的NavControllerProvider,通常是NavHostFragment自身。
    • NavController是导航的核心控制对象,它负责处理导航操作,如导航到特定目的地、返回上一个目的地等。
  3. 导航图的加载:

    • NavController在初始化过程中会加载导航图。导航图通常是一个 XML 文件,定义了应用的导航结构,包括各个目的地(Fragment)以及它们之间的连接关系。
    • NavInflater类负责解析导航图 XML 文件,并创建对应的NavDestination对象树。每个NavDestination代表导航图中的一个目的地,如一个 Fragment。

二、导航操作阶段

  1. 导航请求的发起:

    • 当用户触发一个导航操作时,比如点击按钮触发导航到另一个 Fragment,通常会调用NavController.navigate()方法。这个方法接收一个动作 ID,该 ID 在导航图中定义了从当前目的地到目标目的地的导航动作。
    • 例如:navController.navigate(R.id.action_fragment1_to_fragment2);
  2. NavController的处理:

    • NavController接收到导航请求后,会根据当前的导航状态和导航图来确定如何执行导航操作。
    • 它会遍历导航图中的目的地树,找到当前位置和目标位置之间的路径。然后,根据导航动作的类型(如替换、弹出到目标等),决定如何切换 Fragment。
  3. FragmentNavigator的作用:

    • NavController通常会使用不同的Navigator实现来执行具体的导航操作。对于 Fragment 导航,会使用FragmentNavigator
    • FragmentNavigator负责在NavHostFragment中管理 Fragment 的显示和切换。它会创建、显示和移除 Fragment,以实现导航效果。
  4. Fragment 的切换:

    • FragmentNavigator会根据导航动作的要求,创建目标 Fragment 的实例,并将其添加到NavHostFragmentFragmentManager中。
    • 如果是替换操作,会先移除当前显示的 Fragment,然后添加目标 Fragment。如果是弹出操作,会根据回退栈的状态进行相应的 Fragment 移除操作。

三、生命周期管理阶段

  1. LifecycleOwner的集成:

    • NavHostFragment实现了LifecycleOwner接口,这使得它可以感知自身的生命周期变化。NavController会根据NavHostFragment的生命周期状态来调整导航操作。
    • 例如,当NavHostFragment进入暂停状态时,NavController可能会暂停一些导航相关的操作,以避免不必要的资源消耗。
  2. 回退栈的管理:

    • NavController维护了一个导航回退栈,用于记录用户的导航历史。当用户按下返回键时,NavController会根据回退栈的状态,弹出当前显示的 Fragment,显示上一个 Fragment。
    • FragmentNavigator会在 Fragment 的切换过程中正确地管理回退栈,确保回退操作符合预期。

总之,Jetpack Navigation 通过精心设计的类和接口,实现了从导航图的加载、导航请求的处理到 Fragment 的切换和生命周期管理的完整工作流程。这种设计使得应用的导航逻辑更加清晰、可维护,并且易于与其他 Jetpack 组件集成。

相关文章:

  • 【C++ 面试 - 内存管理】每日 3 题(三)
  • 京存分布式赋能EDA应用
  • Aviator的介绍与使用以及基本原理
  • 如何选择适合医疗器械行业的ERP软件?盘谷医疗 符合验收
  • python爬虫,使用pyppeteer异步,爬取,获得指定标签内容
  • 如何在没有密码的情况下从 iPad 中删除 MDM?100% 工作
  • 【系统架构设计】测试评审方法
  • 打卡学习Python爬虫第五天|Xpath解析的使用
  • 书生大模型实战营第三期基础岛第三课——浦语提示词工程实践
  • 城乡燃气安全监管平台 打造城市安全防护网
  • JavaJSON处理工具类JSONUtils
  • python-字符串排序(赛氪OJ)
  • 视频转音频mp3软件有哪些?分享好用的转换工具
  • docker具体操作
  • 一把手告诉你联盟营销白帽电商广告借力NewsBreak头条优势
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CentOS7简单部署NFS
  • es6--symbol
  • Java 网络编程(2):UDP 的使用
  • JS字符串转数字方法总结
  • leetcode98. Validate Binary Search Tree
  • passportjs 源码分析
  • PHP 的 SAPI 是个什么东西
  • Python 反序列化安全问题(二)
  • React系列之 Redux 架构模式
  • Redash本地开发环境搭建
  • spark本地环境的搭建到运行第一个spark程序
  • Vim Clutch | 面向脚踏板编程……
  • vue中实现单选
  • vue自定义指令实现v-tap插件
  • 给第三方使用接口的 URL 签名实现
  • 警报:线上事故之CountDownLatch的威力
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Golang中select的用法
  • 如何在 Tornado 中实现 Middleware
  • 设计模式走一遍---观察者模式
  • 小程序测试方案初探
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​一些不规范的GTID使用场景
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (4)(4.6) Triducer
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (备忘)Java Map 遍历
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Google的Objective-C编码规范
  • (转)IOS中获取各种文件的目录路径的方法
  • .gitignore文件使用
  • .NET CORE Aws S3 使用
  • .net core 管理用户机密