大家好,我是苍王。以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表
大家应该有看完我的第十二编的页面跳转会清楚跨module的跳转用Android原生来做是,需要使用隐式跳转完成。
但是原生跳转方式是有很多的局限性的。这里借用ARouter 对跳转的分析的一张图来介绍一下,这个图可以很容易的反映出原生跳转和路由跳转的差异。
(1)显示跳转需要依赖于类,而路由跳转是通过url索引,无需依赖
(2)隐式是通过AndroidMainfest集中管理,协作开发困难,
(3)原生需要在AndroidMainfest里面注册,而路由是用注解来注册
(4)原生只要启动了startActivity就交由Android控制,而路由是使用AOP切面编程可以作控制
这样对比,可以很明显的体现出路由跳转的方面和非常适合组件化解耦。
接下来我会对比下我所知道的两款有口碑的路由框架ARouter和ActivityRouter。
一.ARouter的配置介绍
大家有听说过大名鼎鼎的ARouter路由框架,这是有阿里出品的开源路由框架。今天配置了一下,感觉真的不少坑。
这里我以我的组件化Gank工程给大家演示一下,觉得有用欢迎给个star
(1)首先我们需要在base module里面添加一些配置
compile引用aouter-api库,
annotationProcessor是AOP注解需要的
然后annotaitonProcessor会使用javaCompileOptions这个配置来获取当前module的名字
这里还比较奇异的地方时,其他使用了ARouter的路由跳转的module(只要声明了Route注解的module)都需要配置红框的两个地方,不然会无法跳转成功。
当然我们还需要将加Application初始化
这里通过BuildConfig来区分打Log的情况,还需要使用ARouter.init()初始化
然后以web模块为例
我们的WebActivity需要添加注解Route,path是跳转的路径
然后通过ARouter的引用调用,build填的是地址,withXXX填的是参数的key和value,然后navigation就是发射了路由跳转了。
这里用的是建造者模式。
然后webActivity通过读取传递的intent的方式就可以获取参数了。
以为这样就完了,这里是我收集到ARouter踩到的坑,这里才是精华。
(1)请一定要保证每个需要跳转的module都需要加入,不然跨模块跳转不起来
会报出这样的log
(2)这里ARouter是对v4包是有依赖的,而且其包必定是要在25.2.0以上(我当前看的源码是需要这个,以后是否有更改,就需要大家查询了),这里需要感谢讨论群里的“98度”同学的提醒
(3)接下来,才是巨坑,这里面多个相同的group出现,就会提示出现
查了一下Route里面的代码,发现有以下这么一行,说明他是以group划分了,group名不应该相同。
这里group名就是path = “/XXX/XX“里面的第一个XXX了,每个module的group名都不应该相同。
如果遇到什么坑,也可以在评论或者加我讨论群告诉一下大家。
****2017.5.19****
发现了在Window电脑中编译无问题,在mac中编译就跳转不过过去。
遇到了一些大坑,因为Mac在Application中使用了BuildConfig结果无法正常调用。
只要注释了这里就能正常通过。。。
****2017.7.20****
感谢QQ群内的浇草少年发现的ARouter使用问题,
当使用retrolambda需要引用plugin,这样的顺序是有问题的。
需要调整一下retrolamda的顺序。很可能两个都从写了apt里面的方式,有什么潜在问题,之后有待考究。但是浇草少年暂时未遇到问题。
一.ActivityRouter的配置介绍
首先ActivityRouter比ARouter要先发布很多。但是配置比起ARouter要麻烦很多,显得相当不友好。
其配置方式有两种。
第一种方式是和ARouter一样,都是每个Module里面都要配annotaionProcessor
使用apt方式,你可能遇到以下的错误,RouterMapping一直找不到相应的对象。
然后每个Module中的需要路由跳转的Activity都需要配置这个scheme
每个Module都需要配一个空的引用类和Module注解
其Application需要配置Modules注解,包含注册的module对应的字符串
然后在对应的需要路由跳转的Activity跳转地址
简单的跳转调用Routers.open方法,调用scheme:data + module activity对应跳转地址
这样就能跳转成功了。
至于踩到什么坑
(1)申明地址的时候,地址开头不能带有“ /”,因为跳转的时候声明scheme data里面其跳转地址如果加上“/”开头,将会带有多/(如cangwang:///main),为了规避解析异常。
(2)跳转参数有两种方式,可以看ActivityRouter的例子里面,一种是通过地址包含参数
另一种是通过声明参数的类型来做
这里比较坑的地方时,如果需要带参数,需要以“?”+参数名+“=”+参数值 的方式传递
下面是例子
第一种方式
这里第一个值desc直接传递到title这个key里面
第二种方式传递
其参数名只需要写到对应的xxxParams里面。
跳转启动
(3)如果你考虑传递网址或者文件目录这些参数,你是无法使用第一种方式传递的,只能选择第二种方式。
因为其无法通过第一种方式解析出跳转的地址。
通过第二种方式传递,其能通过=来匹配传递内容。
而跳转失败是不会有log提示的,只能调试其源码才能看出来,排查过程真心有点累。
对比来看ActivityRouter配置灵活性比不上ARouter,ARouter参数传递更加简便。如果选型来说,还是选择后者。
我会在之后的章节给大家剖析ARouter的原理。
如果有不同的看法和建议,也可以留言给我,或者加我群,大家一起讨论。
总结
使用路由的初衷是因为考虑到以后网络跳转到原生页面,需要更好的解耦方式,也防止AndroidMainfest管理复杂化问题。
考虑踩过的坑,还是发现有一些缺陷的地方。
1.无法像Android使用startActivies启动多个intent
2.配置和侵入性,每个module都需要使用注解框架。
3.如果考虑到以后应用会sdk化,因为其包含注解框架,需要认真考虑是否值得使用路由框架。
这一节介绍就到这里,
下一节将会更精彩,敬请期待!!!
群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!