一.ARouter是什么
ARouter是由阿里推出的一款页面路由框架,主要用于组件化开发过程中,组件之间页面的跳转和通信,确保组件之间没有相互依赖,也能进行跳转
二.为什么要使用ARouter
Android原始的页面跳转最常用到的是显示Intent和隐式Intent跳转方式
显示Intent跳转:
Intent intent = new Intent(this,XXXActivity.class);
startActivity(intent);
缺点:由于需要直接持有对应class,从而导致了强依赖关系,提高了耦合度
隐式Intent跳转:
Intent intent = new Intent();
intent.setAction(“com.android.activity.MY_ACTION”);
startActivity(intent);
缺点:action等属性的定义在Manifest,导致了扩展性较差,规则集中式管理,导致协作变得非常困难。
使用原生Intent跳转时,跳转的过程开发者无法干预,一些埋点,登录判断等通用的逻辑操作比较难实现,不可能再每一个页面去单独判断,我们的目标是在页面跳转的过程统一去判断,而原生的跳转方式无法实现,所以才有了ARouter页面路由。
ARouter页面路由可以解决的问题:
1.可以实现多个组件之间的跳转,确保各个组件之间相互独立,互不依赖
2.可以实现自动注册(只要添加了相关注解,就可以实现自动注册到ARouter框架)
3.可以知晓页面跳转的过程,对跳转的过程进行监听(降级策略)
4.可以对页面跳转进行拦截(登录判断,埋点)
5.支持InstantRun
6.可以直接解析标准URL进行跳转,并自动注入参数到目标页面中
7.可以通过控制反转来做组件解耦(IProvider)
ARouter典型的应用场景:
1.从外部URL映射到内部页面,以及参数传递与解析
2.跨模块页面跳转,模块间解耦
3.拦截跳转过程,处理登陆、埋点等逻辑
4.跨模块API调用,通过控制反转来做组件解耦
ARouter的原理:
ARouter框架主要是采用注解的形式,为目标Activity添加@Route注解,我们称之为路由。路由框架会在编译时期通过apt生成一些存储path和activity.class映射关系的类文件,当app进程启动的时候,加载目标Activity类文件时,把保存这些映射关系的数据读到内存(保存在map中,path=A.class),然后在进行路由跳转时,通过build()方法传入的目标页面的path路劲,ARouter框架会用这个path路劲从路由表(map容器)里面找到对应的Activity.class类文件,然后new Intent(context, activity.Class),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。
三.ARouter怎么用
1.框架依赖
在项目的build.gradle中defaultConfig闭包中添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
在dependencies中添加
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
2.在Application中初始化ARouter
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
3.常用的功能:
3.1.普通不带参数的页面跳转(等价于startActivity())
目标Activity:添加@Router注解,定义唯一识别的路劲path,path路劲必须两级