美文网首页
我对ARouter的使用心得

我对ARouter的使用心得

作者: wzg_gitee | 来源:发表于2022-03-27 23:44 被阅读0次

    注释:其实文档真的很齐全了,写这个主要讲一下自己的使用,方便以后回顾,如果对小伙伴们有帮助当然是做个好事

    一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦

    先放出ARouter的官网地址:

    ARouter

    后面关于组件化的文章及demo会放在这里:

    文章地址和demo坑位,暂时还没有写

    1.集成到项目中(请移步使用最新版本)
    image.png
    "com.alibaba:arouter-api:1.4.1",
    "com.alibaba:arouter-compiler:1.2.2",
    
    2.在build.gradle
    image.png
    //阿里路由框架配置
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [AROUTER_MODULE_NAME: project.getName()]
                }
            }
    
    3.初始化arouter
    image.png
    
            //初始化阿里路由框架
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
            ARouter.init(application); // 尽可能早,推荐在Application中初始化
    
    
    4.接下来就是开始使用了

    1)首先:在Activity/Fragment类上面写上 Route path 注解。
    注意:这里的路径需要注意的是至少需要有两级,/xx/xx
    2)然后:在Activity/Fragment类里面进入Arouter 注入,也就是:

    ARouter.getInstance().inject(this);
    

    3)接着:目标的Activity类上面需要声明Route path 注解,以此对应(跳转如果不对应路径,框架会Toast说路径不匹配)

    4)这里有个需要注意的地方,不要头铁在fragment/activity销毁或者暂停的地方调用以下代码:

    ARouter.getInstance().destroy( )
    
    例子:看下面的图片
    image.png

    如果图片没法发就看这里吧

     ARouter.getInstance()
                        .build(MyRouterPath.Home.home)
                        .withString("name", "wzg")
                        .navigation(this, 5);
    

    1)其实ARouter.getInstance().build(“目标界面对应的路径”).navigation(); 就这样一行代码即可完成跳转界面。

    2从图片可以看到携带了参数name(相当于类似intent的船参数,只不过是arouter内部封装的),还有后面navigation的数字也就是requestCode,你可以和平时一样在onActivityResult获取其他节目会传的数据

    3)你可以看到传递参数了,我们该如何获取传递的参数呢,是否可以使用getIntent,no!!!!,看下面:

    @Autowired(name = "name")
        String name;
    
    

    没错,就是这么简单(这个注解做过后台老铁肯定一眼就明白了,如果不明白也没有关系,从字面意思即可理解)。当然对象也是支持传递的,这点无需要心。
    为了正确性,也可以log一下,这里就不展示结果了。

    注释:这里说明一下我的注解中加了个name==“xxx”,是为了对印传过来的key,当然如果属性字段取名一致也可以不写name的内容(name==“xxx”)

    4).常见的类型,框架也做了支持,看看下方图片,如果看不到就算了,比较简单:


    image.png

    5)补充一下,有时候我们需要进行设置跳转动画该怎么办?这种问题其实框架的设计者这么会想不到。

    界面跳转动画
    
    直接调用withTransition,里面传入两个动画即可(R.anim.xxx)
    
    // 转场动画(常规方式)
    ARouter.getInstance()
        .build("/test/activity2")
        .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
        .navigation(this);
    
    5.框架还有个比较实用的功能就是自定义拦截器,比较可惜的是,我误删除了写的demo,看看框架的原文的吧
    // 比较经典的应用就是在跳转过程中处理登陆事件,这样就不需要在目标页重复做登陆检查
    // 拦截器会在跳转之间执行,多个拦截器会按优先级顺序依次执行
    @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) {
        // 拦截器的初始化,会在sdk初始化的时候调用该方法,仅会调用一次
        }
    }
    

    1)实际上是可以定义多个拦截器的,没有记错的priority决定拦截器的优先级,数字越小,拦截器先执行。

    2)注释:我发现这里有个坑:如果需要让他拦截执行不到,要手动处理一下,加个异常。

    看看回调处理处理吧,也是原文:

    处理跳转结果
    // 使用两个参数的navigation方法,可以获取单次跳转的结果
    ARouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() {
        @Override
        public void onFound(Postcard postcard) {
        ...
        }
    
        @Override
        public void onLost(Postcard postcard) {
        ...
        }
    });
    
    

    你可以在这里处理成功或者失败的逻辑。

    6更多的功能

    1)初始化中更多设置

    
    ARouter.openLog(); // 开启日志
    ARouter.openDebug(); // 使用InstantRun的时候,需要打开该开关,上线之后关闭,否则有安全风险
    ARouter.printStackTrace(); // 打印日志的时候打印线程堆栈
    

    2)其他设置

    // 构建标准的路由请求
    ARouter.getInstance().build("/home/main").navigation();
    
    // 构建标准的路由请求,并指定分组
    ARouter.getInstance().build("/home/main", "ap").navigation();
    
    // 构建标准的路由请求,通过Uri直接解析
    Uri uri;
    ARouter.getInstance().build(uri).navigation();
    
    // 构建标准的路由请求,startActivityForResult
    // navigation的第一个参数必须是Activity,第二个参数则是RequestCode
    ARouter.getInstance().build("/home/main", "ap").navigation(this, 5);
    
    // 直接传递Bundle
    Bundle params = new Bundle();
    ARouter.getInstance()
        .build("/home/main")
        .with(params)
        .navigation();
    
    // 指定Flag
    ARouter.getInstance()
        .build("/home/main")
        .withFlags();
        .navigation();
    
    // 获取Fragment
    Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
                        
    // 对象传递
    ARouter.getInstance()
        .withObject("key", new TestObj("Jack", "Rose"))
        .navigation();
    
    // 觉得接口不够多,可以直接拿出Bundle赋值
    ARouter.getInstance()
            .build("/home/main")
            .getExtra();
    
    // 转场动画(常规方式)
    ARouter.getInstance()
        .build("/test/activity2")
        .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
        .navigation(this);
    
    // 转场动画(API16+)
    ActivityOptionsCompat compat = ActivityOptionsCompat.
        makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);
    
    // ps. makeSceneTransitionAnimation 使用共享元素的时候,需要在navigation方法中传入当前Activity
    
    ARouter.getInstance()
        .build("/test/activity2")
        .withOptionsCompat(compat)
        .navigation();
            
    // 使用绿色通道(跳过所有的拦截器)
    ARouter.getInstance().build("/home/main").greenChannel().navigation();
    
    // 使用自己的日志工具打印日志
    ARouter.setLogger();
    
    // 使用自己提供的线程池
    ARouter.setExecutor();
    
    
    7这里有个比较实用的功能
    生成路由文档
    
    // 更新 build.gradle, 添加参数 AROUTER_GENERATE_DOC = enable
    // 生成的文档路径 : build/generated/source/apt/(debug or release)/com/alibaba/android/arouter/docs/arouter-map-of-${moduleName}.json
    android {
        defaultConfig {
            ...
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
                }
            }
        }
    }
    
    
    最后更多的功能和bug等着你勇敢启航。

    最后说一下,后面有时间会补上一篇根据ARouter路由自己写的组件化项目,也算对事情有个圆满交代。

    相关文章

      网友评论

          本文标题:我对ARouter的使用心得

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