简单使用
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/SecondActivity")
public class SecondActivity extends AppCompatActivity {
@Autowired
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ARouter.getInstance().inject(this);
}
}
发起路由操作
ARouter.getInstance().build("/test/SecondActivity").navigation();
跳转带参数
ARouter.getInstance().build("/test/SecondActivity")
.withLong("key1", 666L)
.withString("key3", "888")
.withObject("key4", new Test("Jack", "Rose"))
.navigation();
页面拦截
先定义一个拦截器@Interceptor
第一种用法
@Interceptor(priority = 8, name = "测试用拦截器")
public class TestInterceptor implements IInterceptor
{
@Override
public void process(Postcard postcard, InterceptorCallback callback)
{
//callback.onContinue(postcard);
callback.onInterrupt(new RuntimeException("我觉得有点异常"));
}
@Override
public void init(Context context)
{
}
}
@Route(path = “/test/SecondActivity”,priority = 8)
ARouter.getInstance().build("/test/SecondActivity").navigation(FirstActivity.this, new NavigationCallback()
{
@Override
public void onInterrupt(Postcard postcard)
{
Log.e("FirstActivity", "onInterrupt" + (postcard != null ? postcard.toString() : "null"));
}
});
第二种
拦截器1:Test1Interceptor
@Interceptor(priority = 5)
public class Test1Interceptor implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
Log.e("testService", Test1Interceptor.class.getName() + " has process.");
//拦截跳转,进行一些处理
if (postcard.getPath().equals("/test/test1")) {
Log.e("testService", Test1Interceptor.class.getName() + " 进行了拦截处理!");
}
callback.onContinue(postcard);
}
@Override
public void init(Context context) {
Log.e("testService", Test1Interceptor.class.getName() + " has init.");
}
}
ARouter.getInstance().build("/test/test1").navigation(this, new NavCallback() {
@Override
public void onFound(Postcard postcard) {
Log.e("testService", "找到了");
}
@Override
public void onLost(Postcard postcard) {
Log.e("testService", "找不到了");
}
@Override
public void onArrival(Postcard postcard) {
Log.e("testService", "跳转完了");
}
@Override
public void onInterrupt(Postcard postcard) {
Log.e("testService", "被拦截了");
}
});
拦截器注意事项:
1.定义多个拦截器的时候,priority的值不能定义一样的,只要其中两个拦截器的优先值一样,编译时会报错。
2.在拦截器的process()方法中,如果你即没有调用callback.onContinue(postcard)方法也没有调用callback.onInterrupt(exception)方法,那么不再执行后续的拦截器,需等待300s(默认值,可设置改变)的时间,才能抛出拦截器中断。
3.拦截器的process()方法以及带跳转的回调中的onInterrupt(Postcard postcard)方法,均是在分线程中执行的,如果需要做一些页面的操作显示,必须在主线程中执行。
没有调callback.onContinue(postcard)即被拦截器拦截了
分组管理
ARouter对页面路由路径的管理是分组做的,默认我们写的路径最前面的就是组名,例如:
@Route(path = “/test/SecondActivity”) 组名就是test,这也解释了之前的路径为什么要至少写两级,因为要组名加具体路径,分组只有在分组中的某一个路径第一次被访问的时候,该分组才会被初始化
注意:ARouter允许一个module中存在多个分组,但是不允许多个module中存在相同的分组,会导致映射文件冲突
参考链接
https://www.jianshu.com/p/46d174f37e82
https://blog.csdn.net/u014068277/article/details/81269474