这款路由框架是阿里Android技术团队开源的一款路由框架。
ARouter官方项目地址
添加依赖:
//defaultconfig中加入
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName :project.getName() ]
} }
compile'com.alibaba:arouter-api:1.3.1'
annotationProcessor'com.alibaba:arouter-compiler:1.1.4'
初始化
官方建议我们在Application里面进行ARouter初始化
//在application
public static boolean isDebug = true;
@Override
public void onCreate() {
super.onCreate();
//aRouter初始化
if(isDebug){
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(this);
}
// 关闭
@Override
public void onTerminate() {
super.onTerminate();
ARouter.getInstance().destroy();
}
开始使用:
1)首先:在Activity/Fragment类上面写上 Route path 注解。
注意:这里的路径需要注意的是至少需要有两级,/xx/xx
2)然后:在Activity/Fragment类里面进入Arouter 注入,写在基类中,也就是:ARouter.getInstance().inject(this);
3)接着:目标的Activity类上面需要声明Route path 注解,以此对应(跳转如果不对应路径,框架会Toast说路径不匹配)
标注地址
/**
* ARouter 地址
*/
public class ARouterConstance {
public static final String ACTIVITY_URL_MAIN = "/app/MainActivity";
public static final String ACTIVITY_URL_NETWORK = "/app/networkactivity/NetworkActivity";
public static final String GROUP_MAIN = "group_main";
public static final String GROUP_NETWORK = "group_network";
}
添加注解
@Route( path =ARouterConstance.ACTIVITY_URL_MAIN,group = ARouterConstance.GROUP_MAIN)
public class MainActivity extends BaseActivity{。。。。。
@Route(path = ARouterConstance.ACTIVITY_URL_NETWORK,group = ARouterConstance.GROUP_NETWORK)
public class NetworkActivity extends BaseActivity {。。。。。
简单页面跳转
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK).navigation()
带参数的界面跳转
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK)
.withSerializable("student",new Student(true))
.withString("name","lsfsf")
.withInt("age",320)
.withParcelable("test",new Start("wi",30))//对象必须parcelable
.navigation()
获取
@Autowired()
String name;
@Autowired()
int age;
//@Autowired(name="test")
Star star;
//必须这杨获取
student = (Student) getIntent().getSerializableExtra("student");
界面跳转动画
直接调用withTransition,里面传入两个动画即可(R.anim.xxx)
跳转动画
使用URI进行跳转
ARouter框架也可以使用URI进行匹配跳转,代码也很少,只需匹配路径一致即可完成跳转:
Fragment跳转
Fragment的跳转也可以参照Activity跳转,第一步依旧是先写上类注释,然后是强转,代码如下
拦截器:
拦截器是ARouter这一款框架的亮点。说起拦截器这个概念,可能印象更加深刻的是OkHttp的拦截器,OkHttp的拦截器主要是用来拦截请求体(比如添加请求Cookie)和拦截响应体(判断Token是否过期)。
ARouter的拦截器,是通过实现 IInterceptor接口,重写init()和process()方法去完成拦截器内部操作的。
/**
* ARouter 拦截器
*/
@Interceptor(priority = 1)
public class UseIInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.e(ARouterConstance.TAG, " priority = 1----useIInterceptor_当前线程----
}
@Override
public void init(Context context) {
Log.e(ARouterConstance.TAG, " priority = 1----useIInterceptor " );
}
}
/**
* ARouter 拦截器
*/
@Interceptor(priority = 7)
public class UseSecondIInterceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.e(ARouterConstance.TAG, " priority = 7----UseSecondIInterceptor_当前线程---- "+Thread.currentThread().getName() );
}
@Override
public void init(Context context) {
Log.e(ARouterConstance.TAG, " priority = 7---UseSecondIInterceptor " );
}
}
使用Interceptor类注解的priority数值越小,越先执行,优先级越高。不能有相同
拦截
在两个拦截器中的process中加入以下代码
if(postcard.getPath().equals(ARouterConstance.ACTIVITY_URL_NETWORK)){
Log.e(ARouterConstance.TAG, UseSecondIInterceptor.class.getName()+" 进行了拦截 ");
}
callback.onContinue(postcard);
监听拦截器
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK)
.navigation(this,/*startActivityForResult==*/123, new NavCallback() {
@Override
public void onArrival(Postcard postcard) {
err("目标抵达是调用--onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());
}
@Override
public void onFound(Postcard postcard) {
super.onFound(postcard);
err("目标被发现时调用---onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());
}
});
}
首先是两个拦截器的初始化,然后,调用了NavigationCallback这个回调函数里面的onFound(),然后执行了拦截器里面的process()方法;当拦截器的process()方法执行完毕以后,最终回调了NavigationCallback里面的onArrival()方法。
NavigationCallback这个简单理解就是ARouter在路由跳转的过程中,我们可以监听路由的一个具体过程。它一共有四个方法:
回调里面的 Postcard 是什么 ,一个包含路线图的容器。能有些API会获取到相应的信息,
err("目标被发现时调用---onFound"+"--goroup=="+postcard.getGroup()+"--path=="+postcard.getPath());
得到
目标抵达是调用--onFound--goroup==group_network--path==/app/networkactivity/NetworkActivity
通过Postcard可以获取到路径的组以及全路径,那么,路径的组(Group)又是什么?是这样,一般来说,ARouter在编译期框架扫描了所有的注册页面/字段/拦截器等,那么很明显运行期不可能一股脑全部加载进来,这样就太不和谐了。所以就使用分组来管理,我们的类标签里面的注释,对于group默认是 “ ”(空字符串)
在 Group简单使用 这张图上面,根据日志,打印了分组的信息,可以发现Group的值默认就是第一个 / /(两个分隔符) 之间的内容。
用组来进行跳转
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK,ARouterConstance.GROUP_NETWORK)
.navigation()
ARouter如何实startActivityForResult()
发送
ARouter.getInstance().build(ARouterConstance.ACTIVITY_URL_NETWORK,ARouterConstance.GROUP_NETWORK) .navigation(this,/*请求码*/123)
返回
setResult(/*响应吗*/124)
接收
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
err("返回跳转====="+requestCode+"---"+resultCode);
}
参考地址:https://www.jianshu.com/p/6021f3f61fa6