[Andriod] 组件化路由跳转

你们好,我是苍王。如下是我这个系列的相关文章,有兴趣能够参考一下,能够给个喜欢或者关注个人文章。java

[Android]如何作一个崩溃率少于千分之三噶应用app--章节列表git


你们应该有看完个人第十二编简书的页面跳转会清楚跨module的跳转用Android原生来作是,须要使用隐式跳转完成。github


可是原生跳转方式是有不少的局限性的。这里借用ARouter 对跳转的分析的一张图来介绍一下,这个图能够很容易的反映出原生跳转和路由跳转的差别。web

(1)显示跳转须要依赖于类,而路由跳转是经过url索引,无需依赖编程

(2)隐式是经过AndroidMainfest集中管理,协做开发困难,api

(3)原生须要在AndroidMainfest里面注册,而路由是用注解来注册网络

(4)原生只要启动了startActivity就交由Android控制,而路由是使用AOP切面编程能够做控制app


这样对比,能够很明显的体现出路由跳转的方面和很是适合组件化解耦。框架

接下来我会对比下我所知道的两款有口碑的路由框架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名都不该该相同。



一.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,也能够扫码进群。我在这里期待大家的加入!!!

相关文章
相关标签/搜索