一、为什么要有路由框架?
我们的项目一般是模块化开发,即只有一个Application模块和若干个Library模块组成,那么Library之间如果不相互依赖的话,该怎么去相互通信?
常规的方法:1、AIDL;2.BroadCast;3.EventBus;4.隐试跳转;这些用起来都不优雅,如果用到路由框架,那么我们只要使用注解,将类或者方法暴露出去,那么其他模块想要跳转,直接一行代码可以搞定。这就是路由框架带来的好处。
二、路由框架凭什么能实现通信?
APT为我们生成了两个类,这两个类里面有两张表(Map),一张是分组表:(key是group,value是DNRouter $$ Group)、一张是路由表(key是path路由地址,value是RoutMeta理解为类的信息)
我们可以联想到BufferKnife框架,它也是通过注解,将每个View绑定,先调用Bufferknife.bind方法,然后就可以省去findViewById的操作,Bufferknife内部也是通过apt注解处理器帮我们自动生成了类文件,执行findViewById的操作也是通过这些类文件操作的,我们只需要传入Activity对象和ViewId,自动的帮我们注入。
阿里提供的ARouter框架,也是基于apt实现,来看下Demo中的第一步DNRouter.init帮我们做了什么事:
init方法示例图
代码中第二步build方法又做了哪些事:
代码中第三步navigation方法:
所以很简单的三步,就能实现组件化之间的跨模块跳转!另外服务的启动,Demo中是定义了一个base模块,内部写了一个暴露的接口TestService实现IService,如果哪个模块的Service想要给其他调用,就继承这个接口:
三、如何将一个项目改造成组件化,并加入ARouter路由框架:
步骤1:
config.gradle增加albaba的依赖地址:
步骤2:
在每个模块的build.gradle中添加能支持编译apt指令:
同时对应模块下的dependencies增加阿里的apt 路由compile依赖:
步骤3:
在公共的base模块,将所有的路由地址path保存在一个类下面,以便好维护:
步骤4:
Application的onCreate执行ARouter初始化:
步骤5:
最后一步:调用ARouter接口,实现跳转或者传参:
Demo地址:
仿ARouer手写的路由框架Demo
使用ARouter改造电商项目源码