arouter 是什么
Android平台中对页面、服务提供路由功能的中间件,我们可以叫他路由器
主要功能 功能介绍
- 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
- 支持多模块工程使用
- 支持添加多个拦截器,自定义拦截顺序
- 支持依赖注入,可单独作为依赖注入框架使用
- 支持InstantRun
- 支持MultiDex(Google方案)
- 映射关系按组分类、多级管理,按需初始化
- 支持用户指定全局降级与局部降级策略
- 页面、拦截器、服务等组件均自动注册到框架
- 支持多种方式配置转场动画
- 支持获取Fragment
- 完全支持Kotlin以及混编(配置见文末 其他#5)
怎么使用
添加依赖和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
添加注解
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
初始化SDK
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
发起路由操作
// 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();
解决那些方案
对下面 activity 替换 arouter的跳转
Intent intent = new Intent(mContext, XxxActivity.class);
intent.putExtra("key","value");
startActivity(intent);
Intent intent = new Intent(mContext, XxxActivity.class);
intent.putExtra("key","value");
startActivityForResult(intent, 666);
过程进行
其他功能自己去官方网站上去看,我啰嗦也是从demo中看到的,demo地址在
https://github.com/alibaba/arouter
自己研究。
遇到的坑有那些
问题1
下面代码 自己建立起来更加demo 建立起来的。
@Route(path = "/select/userinfo")
public class SelectUserInfoActivity extends BaseActivity {
@Autowired
private int ok;
就会报
这样的错误,你就是不知道为什么? 网上也从的和这样的不一样,走了好几遍还是不可以。
这里讲一下android studio 工具的使用 发现 GradleConsole 中有大量的报错信息不被人知道。 如图
下面也有一些报错新,这样就清晰了很多,但是你还是不容易找到,自己从难到易 找到的。
** 才知道 把private 去掉 。或者 **
这样的代码是ok 的。
问题2
ARouter.getInstance().build("test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.navigation();
上面代码会出现 下面报错
修改为 下面就ok 了
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.navigation();
问题三
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.navigation();
这样的代码找不到 /test/1 这个 路由器
这样的初始化,还必须在main app 下的build 下,我用组件化的时候以为会很好的实现。
这些问题困扰了我好长时间,还是对原来demo 不够了解。