步骤:
一、添加依赖
在module的gradle中添加
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
...
}
dependencies {
...
compile 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
...
}
版本自行选择
二、初始化SDK
自定义Application中添加
@Override
public void onCreate() {
super.onCreate();
if (isDebug) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
三、使用
1、添加注解:在支持路由的页面上添加注解(必选) 这里的路径需要注意的是至少需要有两级,/xx/xx
2、
-
应用内简单的跳转
-
跳转并携带参数
-
使用URI进行跳转及拦截器的使用
-
startActivityForResult功能实现
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = Contants.MAIN_ACTIVITY)
public class MainActivity extends BaseActivity {
public static final String TAG = "zzMainActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 跳转的用法
*
* @param view
*/
public void btn(View view) {
// 1. 应用内简单的跳转
// ARouter.getInstance().build(Contants.SECOND_ACTIVITY).navigation();
// 2. 跳转并携带参数
// ARouter.getInstance().build(Contants.SECOND_ACTIVITY)
// .withInt("age", 28).withString("name", "cyz").navigation();
// todo1();
todo2();
}
/**
* startActivityForResult功能实现
*/
private void todo2() {
ARouter.getInstance().build(Contants.SECOND_ACTIVITY)
.withInt("age", 28).withString("name", "cyz").navigation(this,111);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 111:
Log.d(TAG, "onActivityResult----" + data.getStringExtra("Result"));
break;
default:
break;
}
}
/**
* //使用URI进行跳转及拦截器的使用
*/
private void todo1() {
Uri uri = Uri.parse(Contants.SECOND_ACTIVITY);
ARouter.getInstance().build(uri).withString("name", "android").withInt("age", 6)
.navigation(this, new NavigationCallback() {//NavigationCallback这个简单理解就是ARouter在路由跳转的过程中,我们可以监听路由的一个具体过程
@Override
public void onFound(Postcard postcard) {//路由目标被发现时调用
Log.d(TAG, "onFound----getPath=" + postcard.getPath() + "---getGroup=" + postcard.getGroup());
}
@Override
public void onLost(Postcard postcard) {//路由被丢失时调用
Log.d(TAG, "onLost----" + postcard.getPath());
}
@Override
public void onArrival(Postcard postcard) {//路由到达时被调用
Log.d(TAG, "onArrival----" + postcard.getPath());
}
@Override
public void onInterrupt(Postcard postcard) {//路由被拦截时调用
Log.d(TAG, "onInterrupt----" + postcard.getPath());
}
});
}
}
/** @Autowired
String name;
!!!!不能写成!!!!
@Autowired
private tring name;
*
*/
@Route(path = Contants.SECOND_ACTIVITY)
public class SecondActivity extends BaseActivity {
@Autowired
String name;
@Autowired
int age;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
((TextView) findViewById(R.id.tv)).setText(name + age);
Intent intent=new Intent();
intent.putExtra("Result","Result");
setResult(111,intent);
}
}
拦截器的使用
声明拦截器(拦截跳转过程,面向切面编程)
比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查
拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行
@Interceptor(priority = 1)
public class FirstIntercepter implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.d(Contants.TAG,
"FirstIntercepter----process---线程名称:" + Thread.currentThread().getName());
if (postcard.getPath().equals(Contants.SECOND_ACTIVITY)){
//拦截操作
Log.d(Contants.TAG,
"FirstIntercepter----postcard.getPath():" + postcard.getPath());
}
callback.onContinue(postcard);
// callback.onInterrupt(new RuntimeException("我觉得有点异常")); // 觉得有问题,中断路由流程
// 以上两种至少需要调用其中一种,否则不会继续路由
}
@Override
public void init(Context context) {
Log.d(Contants.TAG, "FirstIntercepter----init");
}
}
@Interceptor(priority = 7)
public class SecondIntercepter implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.d(Contants.TAG,
"SecondIntercepter----process---线程名称:" + Thread.currentThread().getName());
if (postcard.getPath().equals(Contants.SECOND_ACTIVITY)){
//拦截操作
Log.d(Contants.TAG,
"SecondIntercepter----postcard.getPath():" + postcard.getPath());
}
callback.onContinue(postcard);/// 处理完成,交还控制权
}
@Override
public void init(Context context) {//// 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次
Log.d(Contants.TAG, "SecondIntercepter----init");
}
}