在模块话开发的时候为了解耦各模块之间是分离的, 那么在实际中各模块之间有需要相互跳转, 传递参数等相关操作 , 然而正常的 intent 达不到想要的需求 , 而此时阿里巴巴推出了一款通过注解的方式 将各个模块之间进行关联
由于其官方文档说的已经很详细了 在此将引用官方文档做简单介绍 及 遇到的坑
如果想了解官方文档的请移至 ARouter 源码地址 或 ARouter官方文档
下面介绍一下 在多模块中的架构中是如何使用的
官方文档的使用
一、功能介绍
- 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
- 支持多模块工程使用
- 支持添加多个拦截器,自定义拦截顺序
- 支持依赖注入,可单独作为依赖注入框架使用
- 支持InstantRun
- 支持MultiDex(Google方案)
- 映射关系按组分类、多级管理,按需初始化
- 支持用户指定全局降级与局部降级策略
- 页面、拦截器、服务等组件均自动注册到框架
- 支持多种方式配置转场动画
- 支持获取Fragment
- 完全支持Kotlin以及混编(配置见文末 其他#5)
- 支持第三方 App 加固(使用 arouter-register 实现自动注册)
- 支持生成路由文档
二、典型应用
- 从外部URL映射到内部页面,以及参数传递与解析
- 跨模块页面跳转,模块间解耦
- 拦截跳转过程,处理登陆、埋点等逻辑
- 跨模块API调用,通过控制反转来做组件解耦
三、基础功能
- 添加依赖和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
- 添加注解
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
- 初始化SDK
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
- 发起路由操作
// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();
// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.withObject("key4", new Test("Jack", "Rose"))
.navigation();
- 添加混淆规则(如果使用了Proguard)
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
- 使用 Gradle 插件实现路由表的自动加载
apply plugin: 'com.alibaba.arouter'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.alibaba:arouter-register:?"
}
}
可选使用,通过 ARouter 提供的注册插件进行路由表的自动加载(power by AutoRegister), 默认通过扫描 dex 的方式 进行加载通过 gradle 插件进行自动注册可以缩短初始化时间解决应用加固导致无法直接访问 dex 文件,初始化失败的问题,需要注意的是,该插件必须搭配 api 1.3.0 以上版本使用!
这是官方的使用方法 然而在我们这个架构中使用的时候 会有些不同
要在使用annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'这个库的时候 会一直报错 , 某个jar包无法下载,在studio中即使翻墙也下载不了 , 或许是studio工具配置代理的原因 , 这里我直接将缺少的jar包下载到了本地 直接引用arouter-compiler库 然后把缺少的jar包直接替换 才搞定
下面来说说 在架构中是如何使用的 吧
首先commonlibrary中引入相关库
arouter-api直接用api的形式引入 而 arouter-compiler 是引入的本地导入的库
在homelibrary 和 mylibrary 中直接引入arouter-compiler 即可
这里需要注意的是:
要你定义几个modle 如果这个modle 要用到路由 就要在这个modle中添加arouter-compiler依赖 否则会找不到
使用方法:
按照之前的方式是
startActivityForResult(new Intent(getActivity(), TestActivity.class),1002);
直接用intent跳转即可 , 而用ARouter 的使用方式:
先在需要跳转的页面中添加注解
// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
// ARouter.getInstance().build("/home/HomeActivity").navigation();
// 2. 跳转并携带参数
// ARouter.getInstance().build("/home/HomeActivity")
// .withLong("key1", 666L)
// .withString("key2", "这是从我的界面传递过来的")
// .navigation();
// 3. 跳转并携带参数 ,携带返回值
// navigation的第一个参数必须是Activity,第二个参数则是RequestCode
ARouter.getInstance().build("/home/HomeActivity")
.withLong("key1", 666L)
.withString("key2", "这是从我的界面传递过来的")
.navigation(getActivity(), 1002);
//返回参数接收的方式与之前一样
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1002) {
String arg2 = data.getStringExtra("arg2");
Toast.makeText(getActivity(), arg2, Toast.LENGTH_SHORT).show();
mTest.setText(arg2);
}
}
注意:
在接收返回参数的时候 , 如果是在Activity中跳转 直接在当前界面的onActivityResult接收即可
但是在fragment中跳转的时候即使写onActivityResult 也无法接收到返回的数据
这里我采用的方式是: 在mainActivity中根据不同的状态码在调用一下想对应的fragment中的 onActivityResult 即可
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 1002) {
mMyFragment.onActivityResult(requestCode, resultCode, data);
}
}
如果有其他好的方式欢迎分享
以上就是,安卓框架搭建(八)路由框架ARouter实现各模块之间通信,的全部内容
如有不了解的 可以去github下载源码 本章节内容为分支8
或 加入安卓开发交流群:安卓帮595856941
相关链接:
下一篇: