简介:
ARouter是阿里Android技术团队开源的一款路由框架,可以使我们在进行模块化开发时提供更好更方便的页面跳转。
本文介绍一下它的基本使用以及会出现的问题:
简单页面跳转
- 同一模块下的活动的跳转
(1)首先我们要在bulid.gradle中添加依赖:
android {
···
defaultConfig {
···
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME:project.getName()]
}
}
}
···
dependencies {
//这里的版本根据github上面lastest version为准
implementation 'com.alibaba:arouter-api:1.5.0'
//这里的版本根据github上面lastest version为准
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
(2)在Application中进行ARouter的初始化,释放资源一般也在Application的销毁方法写
public class HomeApplication extends Application {
//ARouter调试开关
private boolean isDebug = true;
@Override
public void onCreate() {
super.onCreate();
if (isDebug) {
//以下两种属性必须在初始化之前开启
//打印日志
ARouter.openLog();
//开启调试模式(如果在InstantRun模式下进行,必须开启调试模式)
// 线上版本需要关闭,否则会有安全风险
ARouter.openDebug();
}
ARouter.init(this);
}
}
(3)在AndroidManifest中配置自定义的Application
(4)在同一模块下建立两个活动,并注册
@Route(path = "/app/SecondActivity")
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
跳转的页面的Route path 注解一定与在跳转页面之前ARouter.getInstance().bulid函数参数一致
出现 ARouter::Compiler >>> No module name, for more information, look at gradle log.的错误原因:
全部module包括module依赖的module,在每个module的 build.gradle中加上依赖的代码
在添加依赖时一定要 arguments = [AROUTER_MODULE_NAME:project.getName()] AROUTER_MODULE_NAME 不是 moduleName
出现there is no route matched的错误原因(个人在项目中使用了java的配置,用kotlin写的项目,浪费了很多时间)所以在这里给大家看看java和kotlin两种配置,希望大家要犯这种错误:
- Java配置
- kotlin配置
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
defaultConfig {
.......
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
......
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation project(":base")
//组件化项目一般在base类中引入依赖
// implementation 'com.alibaba:arouter-api:1.3.1'
kapt 'com.alibaba:arouter-compiler:1.1.4'
}
- 不同模块下的活动的跳转和上面的方式是一样的,但有几条注意事项要注意一下
(1) 不同模块下活动的跳转,必须有依赖关系,比如说Module A 中想要跳转到Module B的页面,Module A 必须依赖Module B
(2) 不同模块的注解名的一级包名不可以相同
带参数的页面跳转
ARouter.getInstance().build("/show/second").navigation(this,123)
在接受数据的页面重写onActivityResult()方法
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
123 -> if(resultCode == 1)
if (data != null) {
Log.e("MAIN","接收到了 ${data.getStringExtra("name")}")
}
else -> Log.e("MAIN","无")
}
}
在传递数据的页面设置如下(设置了返回码以及需要传递的数据):
val intent = Intent()
intent.putExtra("name","zyy")
setResult(1,intent)
onActivityResult()方法是活动销毁之后调用的方法,我们可以在传递参数的页面调用finish()
如果我们通过返回键来调用,则需要重写onBackPressed()方法
查看回调
ARouter.getInstance().build("/show/second").navigation(this,object : NavCallback() {
override fun onArrival(postcard: Postcard?) {
//TODO("Not yet implemented")
Log.e("SHOW","跳转成功")
}
override fun onFound(postcard: Postcard?) {
super.onFound(postcard)
Log.e("SHOW","找到了")
}
override fun onInterrupt(postcard: Postcard?) {
super.onInterrupt(postcard)
Log.e("SHOW","被拦截了")
}
override fun onLost(postcard: Postcard?) {
super.onLost(postcard)
Log.e("SHOW","找不到了")
}
})
拦截器
@Interceptor(priority = 1)
class MyIIntercepter() : IInterceptor {
override fun init(context: Context?) {
// TODO("Not yet implemented")
}
override fun process(postcard: Postcard, callback: InterceptorCallback?) {
// TODO("Not yet implemented")
if (postcard.path.equals("/show/second")) {
Log.e("MAIN","成功拦截")
}
}
}
自定义拦截器需要实现IInterceptor接口,并且添加@Interceptor的注解,其中priority为拦截器的优先级,值越小,优先级越高;然后实现pocess()和init()方法。
优先级不能相同,否则编译会出现问题