一、ARouter是什么?
ARouter是阿里开源的一款android路由框架。通过路由进行界面跳转,区别于 Intent的显隐式跳转。在模块化的项目中,友好的解决了因模块互相依赖冲突,而界面互相跳转不了的问题,使用ARouter进行跳转,两个 library互相不依赖,也可以相互跳转。
二、ARouter基本用法
1.引入ARouter
2.简单路由跳转界面(1) 目标Activity,通过Router注解路由路径
(2) 起始Activity,通过ARouter进行跳转
3.跳转界面并传递参数(1) 目标Activity,通过Router注解路由路径,通过Intent获取传递过来的参数
(2) 起始Activity,通过ARouter跳转,并传递data参数
4.跳转界面并传递参数,目标界面通过注解的形式,把传递过来的数据与定义的变量进行绑定(1) 目标Activity,通过Router注解路由路径,通过inject进行注入并使用@Autowired进行注解变量
5.使用Uri进行路由跳转,并传递数据(1) 目标Activity,通过Router注解路由路径,通过Intent获取传递过来的参数
(2) 起始Activity,通过Uri进行路由跳转
6.实现StartActivityForResult方式
7.获取路由跳转结果回调
8.加入拦截器(判断isLogin为true时继续跳转目标activity,如果为false时跳转到指定界面)
9.设置降级
三、简述工作原理
1.初始化ARouter
2.ARouter的initARouter初始化,进行是否初始化判断,如未初始化进行初始化日志对象,调用_ARouter的init方法进行_ARouter初始化,初始化成功之后调用afterInit方法,进行加载拦截的配置。
在_ARouter的init进行了LogisticsCenter初始化。
LogisticsCenter是逻辑处理的物流中心,进行了加载编译后的com.alibaba.android.arouter.routes包下的所有类。把这些类进行分类存储到Warehouse中。Warehouse相当于类仓库。
把对应类存入到Warehouse中之后,就完成了_ARouter的初始化,初始化完成后进行对interceptorService复制,就是对应项目中定义了IInterceptor的实现类。方便之后路由跳转时进行拦截操作
以上ARouter初始化完成,ARouter主要做的工作就是把ARouter相关的反射类加载到Warehouse中,在路由跳转中从Warehouse取的对应路由下的界面并进行跳转。同时找出拦截实现类,调用路由跳转时用于拦截。3.执行路由跳转在代码中使用下图所示进行简单路由跳转。通过传入想要跳转的目的路由/lib2/main到bulid中,获取Postcard,通过调用获取的Postcard调用navigation进行路由跳转。
在Postcard类中定义了三个build方法进行构造Postcard对象,可以通过path路由、path路由和group路由组或Uri进行构造。
Postcard类中有五个navigation方法,但最终调用的都是ARouter类中的navigation方法,也可以这么说路由跳转首先是先把路由传进去构造一个Postcard,然后调用ARouter的navigation方法进行跳转。
而ARouter的navigation方法实际上是调用_ARouter的navigation方法来实现具体的路由跳转的。
在 _ARouter的navigation方法中,先处理了postcard,如果在Warehouse中未找到对应RouteMeta,得出路由不匹配, 抛出异常。如果在项目中调用navigation方法是出入了跳转回调Callback,进行调用callback.onLost方法,如果没有出入跳转 回调并且定义了降级处理服务。ARouter就通过DegradeService类找到定义的项目中DegradeService的具体实现了,并调用实现类的onLost方法。同时在Warehouse中找到对应的RouteMeta,首先判断跳转回调Callback是否为空,不为空回 调onFound方法,然后判断postcard是否进行了绿色通道处理。如果进行了处理,即使项目中定义了拦截服务,但是也不会进行拦截,绿色通道相当于免死金牌,继续跳转。而没有绿色通道处理,同时在项目中定义了拦截服务,那么此时会被拦截掉,执行进入项目中拦截服务的对应方法中。
看到这里,就要划重点了,此处就是真真正正进行跳转的地方,看到了我们熟悉的Intent。里面逻辑很简单,就是对Intent跳转进行封装处理,调用 startActivity或startActivityForResult跳转,如果定义了跳转动画,进行动画跳转。如果是一个Fragment就返回 一个Fragement对象。有没有很简单。
最后整个跳转流程了解了,可能对Postcard的封装不太清楚,下面看下Postcard的处理。(1) 对postcard判断是否为null,为null就抛出no postcard异常(2) postcard不为空,在warehouse中用path取RouteMeta,判断是否为null,为null就没有找到对应的RouteMeta, 然后通过group在warehouse中取路由组Class对象,路由组Class对象如果为null抛出路由不匹配异常,路由组Class对象不为 null就构造IRouteGoup对象,把warehouse.routes数据加载到构造的IRouteGroup中并移除 warehouse的组数据,然后递归重新处理postcard,这时通过postcard的path取出RouteMeta,在进行空判断,当 RouteMeta不为null时,对postcard进行设置Destination(项目中path对应的类),设置类型,设置优先级,设置额外附件数据,Uri进行处理,把Uri上传入的数据传入到postcard的Bundle中。
四、流程图初始化流程图:
路由跳转流程图:
路由内部跳转逻辑流程图:
原文链接:http://www.apkbus.com/blog-942559-77512.html
共同学习,写下你的评论
评论加载中...
作者其他优质文章