继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

阿里路由框架-ARouter介绍

汪汪一只猫
关注TA
已关注
手记 590
粉丝 130
获赞 719

一、ARouter是什么?
ARouter是阿里开源的一款android路由框架。通过路由进行界面跳转,区别于 Intent的显隐式跳转。在模块化的项目中,友好的解决了因模块互相依赖冲突,而界面互相跳转不了的问题,使用ARouter进行跳转,两个 library互相不依赖,也可以相互跳转。

二、ARouter基本用法
1.引入ARouter
5b78058d0001c6ba05170402.jpg 
2.简单路由跳转界面(1) 目标Activity,通过Router注解路由路径
5b78058d0001614104780050.jpg 
(2) 起始Activity,通过ARouter进行跳转
5b78058d0001fabb10000074.jpg 
5b78058d00015cdd05670034.jpg 
3.跳转界面并传递参数(1) 目标Activity,通过Router注解路由路径,通过Intent获取传递过来的参数
5b78058e00014ea506050201.jpg 
(2) 起始Activity,通过ARouter跳转,并传递data参数
5b78058e0001df2204050092.jpg 
4.跳转界面并传递参数,目标界面通过注解的形式,把传递过来的数据与定义的变量进行绑定(1) 目标Activity,通过Router注解路由路径,通过inject进行注入并使用@Autowired进行注解变量
5b78058e0001ac6306150262.jpg 
5.使用Uri进行路由跳转,并传递数据(1) 目标Activity,通过Router注解路由路径,通过Intent获取传递过来的参数
5b78058e00014cd006160208.jpg 
5b78058e0001cac906180275.jpg 
(2) 起始Activity,通过Uri进行路由跳转
5b78058e00010c9707420057.jpg 
6.实现StartActivityForResult方式
5b7805af0001d1ae07050027.jpg 
7.获取路由跳转结果回调
5b7805af0001022506400324.jpg 
8.加入拦截器(判断isLogin为true时继续跳转目标activity,如果为false时跳转到指定界面)
5b7805af00016f1106400313.jpg 
9.设置降级
5b7805b000010b7906400273.jpg 


三、简述工作原理
5b7805b000014ccc05630489.jpg 
5b7805b000018de010800091.jpg 
5b7805b10001f47807460128.jpg 
5b7805b10001825106590106.jpg 
5b7805b10001bb9d06740130.jpg 
5b7805b10001d32010800089.jpg 
5b7805bb00012adc06770152.jpg 
1.初始化ARouter
5b7805bc0001636a10100070.jpg 
2.ARouter的initARouter初始化,进行是否初始化判断,如未初始化进行初始化日志对象,调用_ARouter的init方法进行_ARouter初始化,初始化成功之后调用afterInit方法,进行加载拦截的配置。
5b7805bd0001552206400481.jpg 
在_ARouter的init进行了LogisticsCenter初始化。
5b7805bd0001b19006370163.jpg 
LogisticsCenter是逻辑处理的物流中心,进行了加载编译后的com.alibaba.android.arouter.routes包下的所有类。把这些类进行分类存储到Warehouse中。Warehouse相当于类仓库。
5b7805bd0001b85e06400247.jpg 
把对应类存入到Warehouse中之后,就完成了_ARouter的初始化,初始化完成后进行对interceptorService复制,就是对应项目中定义了IInterceptor的实现类。方便之后路由跳转时进行拦截操作
5b7805bd0001c78a10800067.jpg 
以上ARouter初始化完成,ARouter主要做的工作就是把ARouter相关的反射类加载到Warehouse中,在路由跳转中从Warehouse取的对应路由下的界面并进行跳转。同时找出拦截实现类,调用路由跳转时用于拦截。3.执行路由跳转在代码中使用下图所示进行简单路由跳转。通过传入想要跳转的目的路由/lib2/main到bulid中,获取Postcard,通过调用获取的Postcard调用navigation进行路由跳转。
5b7805bd0001289a05550032.jpg 
在Postcard类中定义了三个build方法进行构造Postcard对象,可以通过path路由、path路由和group路由组或Uri进行构造。
5b7805be00015fe604900276.jpg 
Postcard类中有五个navigation方法,但最终调用的都是ARouter类中的navigation方法,也可以这么说路由跳转首先是先把路由传进去构造一个Postcard,然后调用ARouter的navigation方法进行跳转。
5b7805be0001a31f06400295.jpg 
而ARouter的navigation方法实际上是调用_ARouter的navigation方法来实现具体的路由跳转的。
5b7805be00011dec09950070.jpg 
在 _ARouter的navigation方法中,先处理了postcard,如果在Warehouse中未找到对应RouteMeta,得出路由不匹配, 抛出异常。如果在项目中调用navigation方法是出入了跳转回调Callback,进行调用callback.onLost方法,如果没有出入跳转 回调并且定义了降级处理服务。ARouter就通过DegradeService类找到定义的项目中DegradeService的具体实现了,并调用实现类的onLost方法。同时在Warehouse中找到对应的RouteMeta,首先判断跳转回调Callback是否为空,不为空回 调onFound方法,然后判断postcard是否进行了绿色通道处理。如果进行了处理,即使项目中定义了拦截服务,但是也不会进行拦截,绿色通道相当于免死金牌,继续跳转。而没有绿色通道处理,同时在项目中定义了拦截服务,那么此时会被拦截掉,执行进入项目中拦截服务的对应方法中。
180350cl1nhlz6ljba1wlv.jpg 
看到这里,就要划重点了,此处就是真真正正进行跳转的地方,看到了我们熟悉的Intent。里面逻辑很简单,就是对Intent跳转进行封装处理,调用 startActivity或startActivityForResult跳转,如果定义了跳转动画,进行动画跳转。如果是一个Fragment就返回 一个Fragement对象。有没有很简单。
180350ac0zjnjmctk6m9xz.jpg 
180350md407ae3yydl7l4y.jpg 
最后整个跳转流程了解了,可能对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中。
180351ugvnqgvz7qp6nxgv.jpg 
180351co6fl5l8lazldofa.jpg 
180351d4lj91jyf42381cj.jpg 

四、流程图初始化流程图:
180351ve5n9lg2n6li7zee.jpg 
路由跳转流程图:
180351g5ri0gghrhrb992a.jpg 
路由内部跳转逻辑流程图:
180351vd7znetc0oeoxa7n.jpg 
原文链接:http://www.apkbus.com/blog-942559-77512.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP