一文了解Android中路由(Router)的实现

Router

对于一个功能越来越复杂的APP来说,路由对于代码的解耦、页面灵活跳转配置、页面拦截功能提供了很好的支持。下面我将分析业界比较出名的两个路由框架WMRouterARouter的源码,了解他们的实现原理。

这两个框架的实现核心原理是差不多的: 通过注解标注路由信息,在编译期动态扫描路由信息,生成加载路由表信息的java类。并利用 gradle transformasm生成加载全部路由信息的class文件。在app运行时,路由框架反射调用这个class文件,从而完成了路由表的装载

WMRouter

在看整个框架的工作原理之前,先来分析一下它的它是如何完成一次路由的:

基本路由架构梳理

那么路由的基本类UriHandler是如何生成的呢?

路由节点的动态生成

节点生成了?框架是怎么在运行时动态加载这些路由节点的呢?

路由节点的加载

整个框架理解了上面这些基本就了解了其核心,再来分析一个Activity的路由实例

页面路由实例分析

ARouter

ARouter的路由节点的动态加载类似于WMRouter,就不再分析了,这里主要看一下ARouter中是如何组织路由节点,并做Uri的分发的,这是两个框架最大的区别。

接下来就来看一下这两个点在ARouter中是如何处理的:

基本路由过程

对比一下这两个方案,以此来对Android中对于一个路由框架需要的功能做更明确的理解:

方案对比

WMRouterARouter
多scheme和host的支持✅;可随意添加,scheme、host不需要强制配置❎;支持标准URL跳转。有组的概念,一个路由(url)中的path必须属于某个组
动态注册路由节点✅;@RouterUri标注✅;@Route标注
URI正则匹配✅;使用@RouterRegex标注,匹配的path可以直接跳转到对应界面,比如weblink的跳转可以配置正则匹配来路由❎;组的概念存在,不支持
拦截器✅;支持配置全局拦截器和局部拦截器,分别可配置多个,可以自定义拦截顺序✅;支持配置全局拦截器,可以自定义拦截顺序
转场动画✅;✅;
降级策略✅;支持全局降级和局部降级✅;支持全局降级和局部降级
跳转监听✅;支持全局和单次✅;支持全局和单次
跳转参数✅;支持基本类型和自定义类型✅;支持基本类型和自定义类型
参数自动注入❎;✅; @Autowired 注解的属性可被自动注入
外部跳转控制✅; 需要配置入口Acitity,支持的uri需要在Manifest中配置✅;需要配置入口Acitity,支持的uri需要在Manifest中配置
特殊页面跳转控制✅;“exported”注解属性配置,特定页面可以配置不允许跳转❎;
自动生成路由文档❎;✅;
路由节点的生成方式✅; 框架加载时加载全部路由节点到内存✅;按照组的划分进行懒加载
路由节点扩展✅;扩展性高,可以通过一个Uri不止做页面的跳转✅; 一般
kotlin支持❎;不支持,不过可以简单引入kotlin来支持✅; 支持

模块间通信

WMRouterARouter
获取特定接口的实现✅; @RouterService 注解配置,支持获取接口的所有实现,或根据Key获取特定实现✅; @Route 注解配置,支持根据Path获取对应接口实现

以上分析基于的框架版本:

WMRouter: 1.1.0

ARouter: 1.4.0

更多特性

这里只是按照自己的理解做了简单对比,关于两个框架更多特性可访问官方链接:

水平有限,如果错误,欢迎指出。

欢迎Star我的Android进阶计划,看更多干货。

    原文作者:susion哒哒
    原文地址: https://www.jianshu.com/p/8676f2ad4db2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞