Android组件化下的路由框架

10,509 阅读3分钟

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

先看一下大概的流程图:

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

再看一下时序图:

路由时序图.png

下面开始按模块说明:

1、路由分发模块 Dispatcher:

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

核心方法:

image.png

OnDispatcherListener:

image.png

2、路由请求模块:

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

DispatcheRequest:

image.png

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

image.png realDispatchChain:

image.png

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

image.png

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

image.png

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

image.png

3、路由注册模块:

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

1、在Application中统一添加:

image.png OnDispatcherListener的具体实现:

image.png

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

image.png

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

先来看使用方式:

image.png

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

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

image.png

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的注册):

image.png

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

image.png

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

image.png 或者获取fragment

image.png

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

image.png

项目地址(如果代码不对说明我还没上传) yollpoll/sRouter(github.com)

希望大家看完点星星