前言:什么叫路由框架?
引用阿里巴巴官方注释的一句话:一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦。 由此我们也能知道路由框架的作用。更多详情可见官方文档:传送门
一、路由框架的作用
1.页面导航: 通过router技术,可以简化Activity、Fragment等组件之间的跳转,使代码更加简洁和可维护。开发者可以通过定义路由路径,轻松实现页面跳转,而不需要关心具体的实现细节。
2.模块解耦: 在大型项目中,使用router技术可以实现模块间的解耦。每个模块只需要关注自己的逻辑,不需要直接依赖其他模块,从而提高代码的可维护性和可扩展性。
3.动态拦截: 可以全局拦截跳转过程,执行如登录检查、权限验证等操作。
4.参数传递: 通过router技术,可以方便地在页面跳转时传递参数,而不需要显式地在Intent中设置和获取数据。这使得代码更加简洁和易读。
5.统一管理: 路由路径和页面的对应关系可以集中管理,方便进行全局性的修改和维护。
二、ARouter框架的使用
1. 添加依赖配置:
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'
...
}
2. 添加注释:
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
3. 初始化SDK:
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
4. 发起路由操作:
// 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();
5. 添加混淆规则:
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-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
6. 使用 Gradle 插件实现路由表的自动加载 (可选):
apply plugin: 'com.alibaba.arouter'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.alibaba:arouter-register:?"
}
}
更多使用方法这里不再赘述,详情可见官方使用文档。
三、ARouter框架的实现原理
路由框架的实现主要是通过**注解处理**和**反射机制**来实现自动化的路由注册和跳转。
1. 注解处理器APT:
ARouter 使用注解处理器(Annotation Processing Tool, APT)在编译时生成路由表。它扫描所有使用 @Route 注解的类,并将这些类的信息生成一个路由表文件。这些信息包括路由路径、目标类、参数等。
示例注解:
@Route(path = "/test/activity")
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
}
2. 路由表生成:
注解处理器在编译时会扫描所有被 @Route 注解的类,并生成对应的路由表文件。路由表文件中包含了路径和目标类的映射关系。
3. 路由表注册:
在应用初始化时,ARouter 会自动加载生成的路由表文件,并将其注册到内存中。ARouter 使用类加载机制和反射来加载这些文件,并将路径和目标类的映射关系存储在一个 HashMap 中。
4. 路由跳转:
当调用 ARouter.getInstance().build("/test/activity").navigation();
时,ARouter 会从 HashMap 中查找 /test/activity 对应的目标类。
它会创建一个 Intent,并将目标类设置为 Intent 的目标。
然后,通过 startActivity 或 startActivityForResult 方法启动目标 Activity。
5. 参数传递:
ARouter 支持在路由跳转时传递参数。通过 withString, withInt 等方法,可以将参数传递到目标 Activity。
在目标 Activity 中,可以通过 ARouter.getInstance().inject(this);
方法注入参数。
6. 拦截器:
ARouter 支持拦截器,可以在路由跳转前进行一些预处理操作,例如登录检查。
拦截器可以通过实现 IInterceptor 接口,并在注解中声明优先级来实现。
7. 降级策略:
当路由目标不存在或发生错误时,ARouter 支持设置降级策略。
降级策略可以通过实现 DegradeService 接口,并在注解中声明来实现。
使用系统自带的StartActivity()启动后就无法插手其中任何环节了,只能交给系统管理,这就导致了
在跳转失败的情况下无法降级,而是会直接抛出运营级的异常,甚至导致崩溃,这个给用户的感觉就不是很好。
ARouter的降级策略就允许我们在自定义降级服务,在跳转失败的时候可以自行处理,比如可以加载H5页面来处理这种错误情况。
通过以上步骤,ARouter 实现了自动化的路由注册和跳转,大大简化了 Android 应用的页面导航和模块间通信。同时,它的注解处理器和反射机制使得路由表的生成和加载过程对开发者透明,使用起来非常方便。