1.Navigation

  谷歌的野心,页面路由导航框架。支持Fragment、Activity、DialogFragment的导航行为。

  2.Navigation关键类

  下面这张图看一下Navigation关键类图关系

  NavHostFragment:作为内容区域的宿主container.

  NavigationController:作为页面路由导航的控制器

  NavigatorProvider:是导航器提供者。实际上是一个

  HashMap

  NavGraph:收集了所有的路由节点Destination

  NavGrahpNavigator:是个比较特殊的导航器。当解析到navigation资源文件 中navigation标签时会由它创建NavGraph对象。另外它的navigate不执行具体的导航行为,而是分发给FragmentNavigator 、DialogFragmentNavigagtor、ActivityNavigator来执行具体的导航行为。

  ActivityNavigator和FragmentNavigator、DialogFragmentNavigagtor倒是一致的,为了创建各自类型的节点Destination和提供导航行为而生。他们都会在NavHostFragment#onCreate中被创建添加到NavigationController#NavigatorProvider中。

  以上就是简单地对Navigation框架几个关键类作用的解释。

  

Jetpack组件--Navigation组件工作原理分析_第1张图片


  3.Navigation高级用法

  关于Navigation的用法百度上铺天盖地的都是清一色的文章和用法。不过恶心之处在于必须把路由页面写在资源文件中,不利于灵活配置、页面可见的权限控制。基于此皮皮虾客户端采用了注解处理器标记页面节点、自动化构建App页面路由结构图

  NavProcessor注解处理器生成页面路由JSON文件,下面这个方法是自动生成json文件到/app/src/main/assets/目录下

Jetpack组件--Navigation组件工作原理分析_第2张图片

Jetpack组件--Navigation组件工作原理分析_第3张图片

  根据解析出来的json文件生成NavGrahp对象,并绑定到NavController上.这样一来咱们就解决了只能在资源文件中写死路由节点的痛点了。

Jetpack组件--Navigation组件工作原理分析_第4张图片