Arouter简介
ARouter是阿里开源的一款路由框架,为组件化提供解决方案,它支持解析标准URL进行跳转,并自动注入参数到目标页面中;支持添加多个拦截器,自定义拦截顺序。
所谓组件化就是将APP按照一定的功能和业务拆分成多个小组件,不同的组件由不同的开发小组来负责,这样就可以解决大型APP开发过程中的开发与协作的问题,将这些问题分散到小的APP中。
(1)原生路由方案:使用显示Intent和隐式Intent跳转
- 显示Intent存在直接依赖,耦合度过高;
- 隐式Intent存在规则集中式管理Path,导致协作困难;
- 原生路由跳转一旦调用startActivity,后面的流程将无法进行控制拦截;
(2)ARouter自定义路由方案:使用解析标准URL跳转
- 通过解析URL索引进行跳转,解决依赖的问题;
- 通过分布式管理页面配置,解决隐式Intent中集中式管理Path的问题;
- 通过AOP方式支持添加多个拦截器并自定义拦截顺序,解决跳转过程中无法控制的问题;
- 整个路由跳转过程透明,拥有更好的扩展性;
2. ARouter基本使用
ARouter Github地址: https://github.com/alibaba/ARouter
(1)配置app的build.gradle;
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
// Replace with the latest version
implementation 'com.alibaba:arouter-api:1.5.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.1' // 注解处理器
...
}
如果使用Kotlin开发,将上述配置改为:
// 添加'kotlin-kapt'插件
apply plugin: 'kotlin-kapt'
android {
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
dependencies {
implementation 'com.alibaba:arouter-api:1.5.1'
kapt 'com.alibaba:arouter-compiler:1.5.1' // 注解处理器
...
}
(2)初始化SDK,释放ARouter资源?;
public WanFlutterApplication extends Application {
private boolean isDebug = true;
@Override
public void onCreate() {
if (isDebug) {
// 在init方法之前调用,否则不起作用
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // InstantRun mode需开启调试模式,但是线上需将其关闭
}
ARouter.init(this);
}
}
(3)使用@Router注解定义一个路由页面;
// Router path至少需要两级
// "/xx/xxx"
@Router("/app/HomeActivity")
public HomeActivity extends AppcompactActivity {
// 如果name与属性名称一致
// 可以不指定@Autowired注解的name值
@Autowired
Int id;
@Autowired(name="key2")
String userName;
@Autowired(name="test")
Test test;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ARouter inject注入
// 注意:如果没有参数传递,这句可以不写
// 注意:需要在Application中调用ARouter.getInstance.destory()释放资源
ARouter.getInstance().inject(this);
}
}
(4)Activity/Fragment路由跳转,传参数,获取返回值;
// a. 不传递参数跳转
ARouter.getInstance().build("/app/HomeActivity").navigation();
// b. 使用URL跳转
// 我们可以在清单文件中配置<data></data>标签指定uri的值
// <intent-filter>
// <data
// android:host="m.aliyun.com"
// android:scheme="arouter"/>
// ...
// </intent-filter>
Uri uri = getIntent().getData();
ARouter.getInstance().build(uri).navigation();
// c. 传递参数跳转
// 支持基本数据类型、Bundle、数组、列表、Serializable、Parcelable
// 跳转目标页面使用@Autowired注解获取
ARouter.getInstance().build("/app/HomeActivity")
.withInt("id", 88888)
.withString("name", "jiangdg")
.withObject("test", new Test("Jack", "Rose"))
.navigation();
// d. 跳转动画
ARouter.getInstance().build("/app/HomeActivity")
.withTransition(R.anim.in, R.anim.out)
.navigation();
// e. Fragment跳转
Fragment fragment = (Fragment)ARouter.getInstance().build("/app/TestFragment").navigation()
// f. 获取返回值
int requestCode = 1;
ARouter.getInstance().build("/app/HomeActivity").navigation(context, requestCode);
(5)ARouter拦截器实现
- a. 使用@Interceptor注解定义拦截器,并实现
IInterceptor
接口实现;
// priority值表示拦截器优先级,越小优先级越大;
// name值表示拦截器的名称;
@Interceptor(priority=1, name="test")
public class UseIIterceptor implements IInterceptor {
@Override
public void init(Context context) {
// 拦截器初始化
}
@Override
public void process(Postcard postCard, InterceptorCallback callback) {
// 拦截器处理逻辑
// ...
// 如:当跳转到"/app/HomeActivity"页面时,作相关的处理
if (postCard.getPath().equal("/app/HomeActivity")) {
Log.d(TAG, "I Get it");
}
}
}
- b. 使拦截器生效,通过注册路由监听器实现;
ARouter.getInstance().build("/app/HomeActivity")
.navigation(context, new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
// 路由目标被发现时调用
}
@Override
public void onArrival(Postcard postcard) {
// 路由达到之后调用
}
@Override
public void onLost(Postcard postcard) {
// 路由被丢失时调用
}
@Override
public void onInterrupt(Postcard postcard) {
// 路由被拦截时调用
}
});
Postcard
是一个包含路线图(roadmap
)的容器,它允许让我们获取路径的组(group
)以及全路径等信息。
拦截器最终执行顺序: init->onFound->process->onLost(丢失)/onInterrupt(拦截)/onArrival(到达)
(6)自定义分组
ARouter使用分组管理路由的跳转,防止应用在运行时一次性加载所有路