Android组件化下的路由框架

前言

组件化下有几个核心的难点,其中一个就是跨module的页面跳转,本章来实现一个路由框架,具有跨module跳转、路由拦截、fragment跳转、支持混合开发等功能,

先看一下大概的流程图:

主要分为三个模块:1、路由请求模块(图中矩形)2、路由分发模块(图中圆角矩形)3、路由注册模块(图中圆形)

再看一下时序图:

下面开始按模块说明:

1、路由分发模块 Dispatcher:

这是整个路由核心的功能,是实现跨越模块页面跳转的功能,Dispatcher核心思路就是:在dispatcher中注册一个Map<String,OnDispatcherListener>,其中添加来自各个module的OnDispatcher,当调用dispatch方法时,根据解析的url得到对应的onDispatchListener,并调用onDispatch方法,在该方法中打开新的页面。

核心方法:

OnDispatcherListener:

2、路由请求模块:

Dispatcher模块请求需要url,拼写url比较繁琐,所以把请求封装成DispatchRequest,通过建造者模式,实现url的统一封装,此外,参考okhttp的责任链模式,实现了拦截器的功能,可以对路由请求做统一的拦截处理。

DispatcheRequest:

责任链模式: 模仿okhttp,定义interceptpr、chain,进行事件的传递:

realDispatchChain:

DispatcherManager的发送请求以及注册拦截器:


如果需要得到注册的fragment,可以使用这个方法,onDispatch得到的是注解的类名,通过反射得到具体实例:

DispatcherManager的创建和拦截器的注册:

3、路由注册模块:

路由注册模块的核心就是将OnDispatchListener添加到Dispatcher中,有2种方式:

1、在Application中统一添加:

OnDispatcherListener的具体实现:

另外,如果跨平台,比如flutter,是注册到scheme而不是host:

2、第二种注册方式,也是推荐的使用方式——使用注解:

先来看使用方式:


和ARouter一样,只要在对应的Activity中添加一个Route(url)的注解,就自动完成了上面的OnDispatchListner的注册,配合框架里的@Extra注解还能实现参数的自动传递和注入!

原理:利用注解处理器annotation processor,自动生成1中对应的OnDispatchListener。这是自动生成的代码:

apt的核心思路是这样的:

1、收集到每个module中的route注解并获取对应的url。

2、根据包名为各个module生成RegsiterMap,map中按照host区分新建各个Listener的className

3、每个listener根据module的不同,在map中注册一个module和className

4、onDispatch中根据moduel获取到className,通过反射获取到对应的activity

5、最后返回clazzName,方便后面对非activity(fragment、view等)的处理

整个框架使用方法:

1:在需要跳转的activity或者fragment中添加@Route注解(注意,url的格式有要求,native://host?moduel=XXXX 是必须格式,native代表原生页面,默认以及注册跳转,如果需要其他的格式,如flutter请单独注册,参考flutter的注册):

2:初始化Dispatcher Manager和拦截器:

3:发送请求(这里发送请求必须写在协程内)

或者获取fragment

4:别忘了在gradle中注册一下每个模块的包名(这里我实在不知道怎么优化了,annotationprocessor会根据moduel多次运行,理论上每个module生成的临时文件都是独立的,希望有人能告诉我这里应怎么处理)

最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以扫码,加入我们资源丰富,学习氛围浓厚的技术圈一起学习交流吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值