ARouter阿里Android技术团队开源的一款路由框架。
使用ARouter的优势:
原生路由方案一般是通过显示intent和隐式intent两种方式实现的,在显示intent中,存在直接类依赖的问题,导致耦合度高,在隐式intent中,则会出现规则集中式管理,导致协作不方便,这时候使用ARouter就方便处理这些问题了。
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
...
dependencies {
...
implementation 'com.alibaba:arouter-api:1.4.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
}
可选:
apply plugin: 'com.alibaba.arouter'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.alibaba:arouter-register:?"
}
}
public class BaseApp extends Application {
private boolean isDebugARouter = true;
@Override
public void onCreate() {
super.onCreate();
if (isDebugARouter) {
//必须在init之前
ARouter.openLog();//打印日志
ARouter.openDebug();//线上版本需要关闭
}
//官方推荐在Application中初始化
ARouter.init(this);
}
}
/*
普通使用
*/
findViewById(R.id.skip).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//build里是URL路径
ARouter.getInstance().build(Constant.ACITIVTY_SAMPLE)
//传String类型
.withString("name", "hello 我是ARouter")
//传int类型
.withInt("age", 18)
//传序列化对象
.withSerializable("data", new Data("Tom", 19))
//转场动画,navigation必须设置第一个参数
.withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
//第二个参数是requestCode
.navigation(MainActivity.this, 123);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123 && resultCode == 456) {
Log.e(Constant.TAG, "onActivityResult");
}
}
@Route(path = Constant.ACITIVTY_SAMPLE)
public class SampleActivity extends BaseActivity {
@Autowired
String name = "无名";
@Autowired
int age = 10;
@Autowired
Data data;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
textView = findViewById(R.id.textView);
textView.setText("姓名:" + name + ",年龄:" + age + ",data:" + data);
setResult(456);
}
}
拦截器是ARouter这一款框架的亮点。 ARouter的拦截器,是通过实现 IInterceptor接口,重写init()和process()方法去完成拦截器内部操作的。
/*
使用拦截器
*/
findViewById(R.id.interceptor).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ARouter.getInstance().build(Constant.ACITIVTY_SAMPLE2)
.navigation(MainActivity.this, new NavigationCallback() {
@Override
public void onFound(Postcard postcard) {
Log.e(Constant.TAG, "路由目标发现");
}
@Override
public void onLost(Postcard postcard) {
Log.e(Constant.TAG, "路由目标丢失");
}
@Override
public void onArrival(Postcard postcard) {
Log.e(Constant.TAG, "路由目标跳转");
}
@Override
public void onInterrupt(Postcard postcard) {
Log.e(Constant.TAG, "路由目标被拦截");
}
});
}
});
定义一个拦截器
//priority:优先级,数值越大级别越高
@Interceptor(priority = 1)
public class UserInterceptor implements IInterceptor {
@Override
public void init(Context context) {
Log.e(Constant.TAG, "init 拦截器");
}
@Override
public void process(final Postcard postcard, final InterceptorCallback callback) {
Log.e(Constant.TAG, "process 拦截器:" + postcard.getPath());
if (Constant.ACITIVTY_SAMPLE2.equals(postcard.getPath())) {
//拦截操作
MainLooper.runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(MainActivity.getThis())
.setCancelable(false)
.setTitle("提示")
.setNegativeButton("继续", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//继续路由
callback.onContinue(postcard);
}
})
.setPositiveButton("加点数据", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//新增数据
postcard.withString("name", "hello 这里是ARouter!!!");
callback.onContinue(postcard);
}
})
.setNeutralButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//中断路由
callback.onInterrupt(null);
}
})
.show();
}
});
} else {
callback.onContinue(postcard);
}
}
}
这里的服务是接口开发的概念,就是将一部分功能和组件封装起来成为接口,以接口的形式对外提供能力,所以在这部分就可以将每个功能作为一个服务,而服务的实现就是具体的业务功能。
/*
服务
*/
findViewById(R.id.service).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//方法一
ARouter.getInstance().navigation(HelloService.class).say("hello 方式一");
//方法二
((HelloService) ARouter.getInstance().build(Constant.SERVICE_HELLO).navigation())
.say("hello 方式二");
//方式三
ARouter.getInstance().navigation(SingleService.class).say("hello 方式三");
}
});
定义一个服务接口:
public interface HelloService extends IProvider {
void say(String content);
}
实现服务接口
@Route(path = Constant.SERVICE_HELLO)
public class HelloServiceImpl implements HelloService {
@Override
public void init(Context context) {
}
@Override
public void say(String content) {
Log.e(Constant.TAG, "say:" + content);
}
}
直接实现服务接口
@Route(path = Constant.SERVICE_SINGLE)
public class SingleService implements IProvider {
@Override
public void init(Context context) {
}
public void say(final String content) {
Log.e(Constant.TAG, "say:" + content);
}
}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider
代码下载