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

Router

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

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

WMRouter

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

基本路由架构梳理

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

路由节点的动态生成

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

路由节点的加载

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

页面路由实例分析

ARouter

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

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

基本路由过程

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

方案对比

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

模块间通信

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

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

WMRouter: 1.1.0

ARouter: 1.4.0

更多特性

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,144评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,724评论 2 59
  • 前言 今年大数据行业火爆异常,大数据的实用点之一在于数据的统计和加工实现数据的“增值”,方便人们从大量的数据统计中...
    软件iOS开发阅读 211评论 0 0
  • 很久没有更新文章了,说明我变懒了…… 确实,我很懒,我没力气再去像以前一样满怀希望的更新出一篇又一篇的文章。我没有...
    爱读书的无为阅读 279评论 0 0
  • 一场雨洗净了天空, 生活跟时间调换了颜色, 疲惫的身躯麻木着, 控诉我对它太过苛刻。 狂暴的灵魂在咆哮, 阴云覆盖...
    依然yiran06阅读 260评论 0 0