ARouter
1.什么是ARouter?
ARouter是阿里开发的路由框架,主要用于模块化或者组建间实现独立,进行页面跳转。此外还能实现依赖注入功能。
2.ARouter的基本原理。
- 1.注册
B界面将类的信息,通过key-value的形式,注册到arouter中。
- 2.查询
A界面将类信息与额外信息(传输参数、跳转动画等),通过key传递至arouter中,并查询对应需要跳转类的信息。
- 3.结合
将A界面类信息、参数与B界面的类信息进行封装结合。
- 4.跳转
将结合后的信息,使用startActivity实现跳转。
3.导入使用
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'
...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'
2.初始化SDK
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
4.基本使用。
- 跳转无参界面
首先是在需要跳转的地方调用如下的代码。
// 1. 普通跳转
ARouter.getInstance().build("/test/activity").navigation();
跳转Activity中获取实例,然后根据路径build出postcard,最后调用navigation进行跳转。
navigation经过一系列的调用,最后会调用_navigation。可以看到最终会判断postcard类型,如果是activity的话最终会调用startActivity,因此本质上对于activity上来说 Arouter就是封装了startActivity而已。
private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
final Context currentContext = null == context ? mContext : context;
switch (postcard.getType()) {
case ACTIVITY:
// Build intent
final Intent intent = new Intent(currentContext, postcard.getDestination());
intent.putExtras(postcard.getExtras());
// Set flags.
int flags = postcard.getFlags();
if (-1 != flags) {
intent.setFlags(flags);
} else if (!(currentContext instanceof Activity)) { // Non activity, need less one flag.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
// Set Actions
String action = postcard.getAction();
if (!TextUtils.isEmpty(action)) {
intent.setAction(action);
}
// Navigation in main looper.
runInMainThread(new Runnable() {
@Override
public void run() {
startActivity(requestCode, currentContext, intent, postcard, callback);
}
});
break;
…………
然后在被跳转的activity中添加注解@Route(path=“/xx/xx”)
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
注意此处的路径和上面的build时的路径必须一直,否则将会找不到对应的跳转界面。因此一般可以通过将所有的路径集成添加到一个接口中,如下所示。
public interface ActivityPath {
String MAIN_ACTIVITY = "/app1/MainActivity";
String MAIN2_ACTIVITY = "/app1/Main2Activity";
}
- 跳转带参界面
在需要跳转的地方调用以下代码。
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.withSerializable("key4", new Test("Jack", "Rose"))
.navigation();
可以看到都是通过调用postcard(build返回的就是postcard对象)的withxxx的方法,往postcard内的Bundle以key-value的方式存值,和我们传统传递的方式差不多。
public Postcard withString(@Nullable String key, @Nullable String value) {
mBundle.putString(key, value);
return this;
}
最后调用navigation进行跳转。接收参数有三种方式,如注释所示。
@Route(path = "/test/1")
public class YourActivity extend Activity {
//获取数据三种方式
//1.通过Autowired注解 可以通过name=“key1”,将Bundle中“key1”存的值赋值给data
//此外需要注意的是使用这个方法,要在onCreate中调用ARouter.getInstance().inject(this)
@Autowired(name = "key1")
public long data;
//2.通过Autowired注解 变量直接取成key1,这样的效果等同与方法1
//和方法1一样,需要在onCreate中调用ARouter.getInstance().inject(this);配合使用
@Autowired()
public long key1;
//3.通过传统的Bundle获取
public long data2=getIntent().getExtras().getLong("key1");
}
- 传递object
首先先定义解析器,导入gson的依赖后直接复制即可。
@Route(path = "/service/json")
public class JsonSerializationService implements SerializationService {
private Gson mGson;
@Override
public void init(Context context) {
mGson = new Gson();
}
@Override
public <T> T json2Object(String text, Class<T> clazz) {
return mGson.fromJson(text, clazz);
}
@Override
public String object2Json(Object instance) {
return mGson.toJson(instance);
}
@Override
public <T> T parseObject(String input, Type clazz) {
return mGson.fromJson(input, clazz);
}
}
创建测试的实体类
package com.example.myapplication.arouterTest;
import androidx.annotation.NonNull;
public class MyObject {
private String name;
private int age;
public MyObject(String name, int age) {
this.name = name;
this.age = age;
}
@NonNull @Override public String toString() {
return "我叫"+name+",我今年"+age+"岁";
}
}
然后发出跳转操作
ARouter.getInstance().build(ActivityPath.MAINACTIVITY3).withObject("object",new MyObject("张三",18)).navigation();
被跳转activity
SerializationService serializationService= ARouter.getInstance().navigation(SerializationService.class);
serializationService.init(this);
myObject=serializationService.parseObject(getIntent().getStringExtra("object"),MyObject.class);
textView.setText(myObject.toString());
最终显示成功。
-
url跳转
界面配置
<activity android:name=".activity.SchameFilterActivity">
<!-- Schame -->
<intent-filter>
<data
android:host="m.aliyun.com"
android:scheme="arouter"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
发送跳转操作
Uri testUriMix = Uri.parse("arouter://m.aliyun.com/test/activity2");
ARouter.getInstance().build(testUriMix)
.withString("key1", "value1")
.navigation();
目标界面
@Route(path = "/test/activity2")
public class Test2Activity extends AppCompatActivity {
}
参考 https://www.jianshu.com/p/8098961bd30c