ARouter:https://github.com/alibaba/ARouter
参考:
https://github.com/alibaba/ARouter/blob/master/README_CN.md
https://www.jianshu.com/p/6021f3f61fa6
一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦
最新版本
模块 | arouter-api | arouter-compiler | arouter-register |
---|---|---|---|
最新版本 | 1.5.0 | 1.2.2 | 1.0.2 |
一、功能介绍
支持直接解析标准URL进行跳转,并自动注入参数到目标页面中
支持多模块工程使用
支持添加多个拦截器,自定义拦截顺序
支持依赖注入,可单独作为依赖注入框架使用
支持InstantRun
支持MultiDex(Google方案)
映射关系按组分类、多级管理,按需初始化
支持用户指定全局降级与局部降级策略
页面、拦截器、服务等组件均自动注册到框架
支持多种方式配置转场动画
支持获取Fragment
完全支持Kotlin以及混编(配置见文末 其他#5)
支持第三方 App 加固(使用 arouter-register 实现自动注册)
支持生成路由文档
提供 IDE 插件便捷的关联路径和目标类
二、典型应用
从外部URL映射到内部页面,以及参数传递与解析
跨模块页面跳转,模块间解耦
拦截跳转过程,处理登陆、埋点等逻辑
跨模块API调用,通过控制反转来做组件解耦
三、基础功能
1 添加依赖和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
2 初始化SDK
public class MyApplication extends Application {
// private MyApplication mApplication;
private boolean isDebugARouter = true;
boolean isDebug(){
return isDebugARouter;
}
@Override
public void onCreate() {
super.onCreate();
// mApplication = this;
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(MyApplication.this); // 尽可能早,推荐在Application中初始化
}
}
3 简单页面跳转
//@Route(path = "/app/MainActivity")
public class MainActivity extends AppCompatActivity {
...
public void skip(View view) {
ARouter.getInstance().build("/app/SecondActivity").navigation();
}
}
@Route(path = "/app/SecondActivity")
public class SecondActivity extends Activity {
...
}
4 跳转并携带参数
// 2. 跳转并携带参数
public void skip(View view) {
ARouter.getInstance().build("/app/SimpleActivity")
.withLong("key1", 666L)
.withString("key2", "777")
.withString("key3", "888")
.withParcelable("key4", new Person("Jack", 26))
.navigation();
}
// 为每一个参数声明一个字段,并使用 @Autowired 标注
// URL中不能传递Parcelable类型数据,通过ARouter api可以传递Parcelable对象
@Route(path = "/app/SimpleActivity")
public class SimpleActivity extends Activity {
@Autowired
public long key1;
@Autowired
String key2;
@Autowired(name = "key3")
String mykey3;
@Autowired
Person key4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple);
ARouter.getInstance().inject(this);
// ARouter会自动对字段进行赋值,无需主动获取
Log.d("hongxue", "key1 = " + key1);
Log.d("hongxue", "key2 = " + key2);
Log.d("hongxue", "key3 = " + mykey3);
Log.d("hongxue", "key4 = " + key4.getName() + " " + key4.getAge());
}
}
public class Person implements Parcelable {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
protected Person(Parcel in) {
name = in.readString();
age = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}