前言
什么是ARouter?阿里巴巴官方解释是:Android平台中对页面、服务提供路由功能的中间件。那又是什么鬼,有啥功能,什么场合适合使用?官方给的说明是:
一、功能介绍
1、支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
2、支持多模块工程使用
3、支持添加多个拦截器,自定义拦截顺序
4、支持依赖注入,可单独作为依赖注入框架使用
5、支持InstantRun
6、支持MultiDex(Google方案)
7、映射关系按组分类、多级管理,按需初始化
8、支持用户指定全局降级与局部降级策略
9、页面、拦截器、服务等组件均自动注册到框架
10、支持多种方式配置转场动画
11、支持获取Fragment
二、典型应用
1、从外部URL映射到内部页面,以及参数传递与解析
2、跨模块页面跳转,模块间解耦
3、拦截跳转过程,处理登陆、埋点等逻辑
4、跨模块API调用,通过控制反转来做组件解耦
好了,这些理论啥的我就不说了,具体也可以去官方地址查看:https://github.com/alibaba/ARouter
接下来我们来看看怎么使用,一步一步来
使用说明
1、在project gradle里面添加
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0' //推荐是2.3以上
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //路由需要
}
}
2、在 app 和 module 的 gradel 添加依赖
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:1.2.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.0'
...
}
3、新建两个module(lib),然后让app都依赖这两个module
dependencies {
compile 'com.alibaba:arouter-api:1.2.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.0'
//添加下面两个依赖
compile project(':module1')
compile project(':module2')
}
4、在两个module里面都新建一个activity,目的是测试模块化跳转。实验证明,只要app依赖了这两个module,module之间不需再互相依赖就可以实现从module1跳转到module2 。
//添加注解,path必须为 /XX/OO 的形式
@Route(path = "/module1/main")
public class Module1Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_module1);
String data = getIntent().getStringExtra("data");
Toast.makeText(this, "传递的参数:" + data, Toast.LENGTH_LONG).show();
}
}
5、然后从app的activity跳转到module的activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ARouter.init(getApplication());// 初始化,建议放在application里面
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {
Log.e("---", "------------空--------------");
return;
}
if (requestCode == 100 && resultCode == 0) {
String key = data.getExtras().getString("key");
Toast.makeText(MainActivity.this, "回调的内容:" + key, Toast.LENGTH_LONG).show();
}
}
//跳去module1的页面
public void module(View view) {
//不用activityResult
ARouter.getInstance()
.build("/module1/main") //内容就是想跳转去那个module注解的path
.withString("data", "app传过来的内容") //传参,不用就不需写啦
.navigation();
//使用activityResult,相当于 startActivityForResult
ARouter.getInstance()
.build("/module1/main")
.withString("data", "app传过来的内容")
.navigation(MainActivity.this, 100);
//上面的处理和下面的处理功能一样
Intent intent = new Intent(this, Module1Activity.class);
intent.putExtra("data", "app传过来的内容");
startActivityForResult(intent, 100);
}
}
6、加入混淆
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
总结
好啦,上面的用法只是基本功能使用,进阶功能下篇再写吧。然后问题来了,用这个路由,优势在哪里?解耦,主要应该就是这个吧。当项目非常大的时候,需要有很多组件整合的时候,团队可以分别对这些module进行开发,而不会互相影响。