Android开发那些事

一、ARoute

2019-11-15  本文已影响0人  你的益达233

简单使用

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/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

上一篇下一篇

猜你喜欢

热点阅读