Navigation原理分析

原理

通过解析定义在xml布局的各个节点的视图关系,进行页面跳转时调用原生API进行页面切换(Fragment:FragmentManager,Activity Intent)

UML图

Navigation原理分析

核心类

1:NavGraphFragment
(1)作为Fragment导航界面的载体
(2)管理并控制导航的行为(委托给NavController)
(3)导航关系的入口

Navigation原理分析
image.png

创建时机最早,在NavInflater解析的时候通过反射创建,这个类仅仅作为Fragment导航界面的载体,并没有实际承担导航行为,而是将并将导航行为 委托 NavController的实例。
NavController什么时机创建的?一个NavGraphFragment有几个NavController,怎么个对应关系?
在onCreate创建
Navigation原理分析
NavController.onCreate.png

通过根布局的 tag对应
Navigation原理分析
onCreateView

一个NavGraphFragment只有一个NavController
Navigation原理分析
findNavController(View).png

findNavController(View)内部实现是通过 遍历 View树,直到找到最底部NavHostFragment 中的NavController对象,并将其返回的,NavHostFragment 在其 作用域 内,理应 有且仅有一个NavController 的实例。

2:NavController: 导航行为的管家
(1).对navigation资源文件夹下nav_graph.xml的 解析
(2).通过解析xml,获取所有 Destination(目标点)的 引用 或者 Class的引用
(3).记录当前栈中 Fragment的顺序
NavController 持有了一个 NavInflater ,并通过 NavInflater 解析xml文件。
这之后,获取了所有 Destination(在本文中即Page1Fragment , Page2Fragment , Page3Fragment ) 的 Class对象,并通过反射的方式,实例化对应的 Destination,通过一个队列保存. 提供了navigation(),onHandleDeepLink(),popBackStack()
NavController 获取了所有 NavDestination 的Class对象,但是我不负责它 如何实例化 ,也不负责 如何导航 ,也不负责 如何后退 最后通过FragmentNavigator来执行具体的popBackStack()和navigation()

Navigation原理分析
image.png

3:Navigator和NavDestination
Navigator(导航者) 的职责很单纯:
(1).能够实例化对应的 NavDestination
(2).能够指定导航
(3).能够后退导航

Navigation原理分析
image.png

NavDestination代表导航视图中的任一一个导航的节点(FragmentNavigator.Destination和ActivityNavigator.Destination),每种和对应的Navigator关联,内部类,主要存储一些Action的信息.


Navigation原理分析
image.png

(4):Navigation:对外暴露的API入口,提供NavController的静态方法


Navigation原理分析
image.png

5:其他类
(1) NavInflater:布局解析,初始化各个NavDestination
(2) NavigationProvider:NavigationProvider存储 Navigator
6 :借鉴之处
(1)类职责划分清晰
(2)面向接口,扩展性强