1. Navigation到底是什么
类似阿里的Arouter框架,是一个页面路由导航框架。
2. 使用方法
入门教程见官方文档
3. 原理
总体上来说,NavHostFragment作为占位的fragment,加载默认的Fragment(HomeFragment)。跳转时通过目标节点信息(跳转的resId等)结合路由表中的配置,看是Fragment跳转还是Activity跳转。Fragment跳转最终还是使用FragmentTransaction的replace方法,Activity跳转最终使用startActivity。
下面细说涉及到的关键类
-
NavHostFragment: 作为占位的fragment
NavHostFragment初始化时完成两项重要工作:- 注册四类导航器(FragmentNavigator 、DialogFragmentNavigagtor、ActivityNavigator、NavGrahpNavigator)
- 通过setGraph方法解析配置的导航关系(nav_graph.xml),生成路由节点Destination保存到NavGraph中
- NavGraph:收集了所有的路由节点Destination
- NavigationController:页面路由导航的控制器,对外提供导航能力
-
NavigatorProvider:路由表,里边保存了两个HashMap
-
HashMap<Class<?>, String> sAnnotationNames
,注解map,以注解的Navigator子类为key,以注解name为value,作用是获取导航器类的注解名 -
HashMap<String, Navigator<? extends NavDestination>> mNavigators
,导航器map,以注解的name为key,以导航器为value,作用是通过解析nav_graph.xml节点名,获取导航器
-
- FragmentNavigator:负责Fragment的跳转。原理:通过反射实例化Fragment,最终使用FragmentTransaction的replace方法使用Fragment跳转。
- DialogFragmentNavigator:负责DialogFragment的跳转。原理:通过反射实例化Fragment,强转成DialogFragment,使用show方法显示。
- ActivityNavigator:负责Activity的跳转。原理:获取intent参数,生成intent对象,通过startActicity(intent)跳转。
- NavGraphNavigator:分发导航,不执行具体导航。原理:通过导航节点获取导航name,从而从路由表中获取真正的导航器(FragmentNavigator 、DialogFragmentNavigagtor、ActivityNavigator),由这三种导航器负责跳转 。