🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
文档当前状态:**beta0.5** * [x] 选题收集:2017/11/25 * [x] 初稿整理: * [ ] 补充校对: * [ ] 入库存档: --- 这里主要会对ARouter路由使用过程中需要注意的地方进行梳理: #### 路由注解 * **不要使用手动分组** 在ARouter使用中,给目标路径配置路由时,是下面这行代码: ~~~ //默认分组 // 这里的路径需要注意的是至少需要有两级,/xx/xx @Route(path = "/test/activity") public class YourActivity extend Activity { ... } //主动分组 @Route(path = "/test/1", group = "app") // 构建标准的路由请求,并指定分组 ARouter.getInstance().build("/home/main", "ap").navigation(); ~~~ 文档中还提到了 用户主动分组的用法,但是在酷源码的浏览中发现 主动分组的 方法已标注为 过时,建议使用默认分组。 ~~~ /** @deprecated */ @Deprecated public Postcard build(String path, String group) { return _ARouter.getInstance().build(path, group); } ~~~ * **分组策略** **硬性规定**:ARouter允许一个module中存在多个分组,但是不允许多个module中存在相同的分组,会导致映射文件冲突。 **优化建议** :根据路由表初始化策略,每个分组 仅在首次访问时才会加载,为了避免加载过长,分组粒度 应该竟可能的小,每个分组10个左右为宜;[参考链接](https://github.com/alibaba/ARouter/issues/66) * **多个路由地址,跳转同一个页面** 暂时不能,后续也不会支持 @Route(path ) 多个路由地址,如果有类似的需求,可以使用PathReplaceService实现。 #### 跳转 * **ARouter 如何去实现startActivityForResult的效果** 在多module的场景下,我们无法直接 过去其他module Activity的class,ARouter正是为此而生,你可以使用下面的方法 ~~~ //startActivity() ARouter.getInstance().build("/test/activity").navigation(); //startActivityForResult() ARouter.getInstance().build("").navigation(this,requestCode) ~~~ * **ARouter跳转后finish当前页面会有短暂的黑屏或白屏** **问题描述**:使用下面代码进行跳转时会有 黑屏或白屏 ~~~ ARouter.getInstance().build("/test/activity").navigation(); finish(); ~~~ **处理**:目前ARouter 跳转Activity的时候现在是强制使用post(Runnable)方式,现在这种实现调navigation后立即调finish()关掉当前Activity会出现短暂白屏(白屏黑屏跟主题有关),需要设置一个NavigationCallback,在onArrival()回调中 finsih()。 ~~~ ARouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() ~~~ * **LaunchMode不生效** **问题**:有几个Activity设置了android:launchMode="singleTask"和android:launchMode="singleInstance",使用startActivity跳转界面,设置能生效,但使用 ARouter.getInstance().build(path).navigation()设置却无法生效。还是一直创建新界面,getTaskId()也一直是新的。AndroidManifest.xml里设置android:launchMode没有生效。 **处理方案:** 查看navigation跳转部分的源码, ~~~ //代码位置 _ARouter.class的_navigation方法 int flags = postcard.getFlags(); if (-1 != flags) { intent.setFlags(flags); } else if (!(currentContext instanceof Activity)) { // Non activity, need less one flag. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } ~~~ 从代码段可以看出 如果你在跳转activity的时候传入当前activity对象,他就不会为intent设置Flag,因为arouter跳转startActivity的时候不传activity对象的话,默认使用的ApplicationContext,使用ApplictaionContext跳转必须加上Intent.FLAG_ACTIVITY_NEW_TASK这个flag,从而导致了你说的问题。如果你想实现预期效果,要么使用navigation(activity),要么在build时候,手动setFlags()。 #### 未分类 * **app自定义WebVIewClient处理URL跳转** **问题**:如果 WebView 设置了 WebViewClient, 发现 路由功能 不起作用了。 当然, 之所以设置WebViewClient,是为了 直接在APP 中的WebView 打开网页,换言之,就是不启动浏览器。然而 有些H5 需要打开原生界面,这该如何处理呢? **处理方案**:自己提供 webviewClient,要自己处理 schame 跳转,拼装 intent。 webview.setWebViewClient(new WebViewClient()); 需要自己在shouldOverrideUrl里面去处理自定义Schame,你直接就写了一行new WebviewClient 肯定不行。 [参考链接1](https://github.com/alibaba/ARouter/issues/248) [参考链接2](https://github.com/alibaba/ARouter/issues/107) #### 传递值 * **Kotlin Autowired数值编译不成功** Kotlin中的属性 默认实现了get set方法,如果需要使用Autowired来实现注入,需要加上@jvmfield是可以编译的 属性如果多的话每个都需要加有点繁琐 [参考链接](https://github.com/alibaba/ARouter/issues/243) * **传递自定义对象 或者集合 需要实现SerializationService 接口** 早期版本 默认使用FashJson,后来改成SerializationService,如果需要传递自定义对象,需要实现该接口 #### 暴露服务 * **不同Module中服务的相互调用** **问题**:现在有App,MoudleA、MoudleB ,采用ARouter 的方式暴露服务,但IAService、IBService 接口、以及实现类分别在MoudleA、MoudleB中,MoudleA 需要拿到IBService,ModuleB需要拿到IAService,但ModuleA和MoudleB是不能相互依赖的,所以相互调用的时候,如何才能编译通过,独立打包呢? **处理**:建议你每一个业务模块单独提供一个接口包,这个包中包含接口和传递数据的对象,这样互相依赖接口包就行了。[参考链接](https://github.com/alibaba/ARouter/issues/90)