一、ARoute

作者: 你的益达233 | 来源:发表于2019-11-15 20:06 被阅读0次

    简单使用

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

    相关文章

      网友评论

        本文标题:一、ARoute

        本文链接:https://www.haomeiwen.com/subject/naasictx.html