Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ARouter三问—腾讯真题

ARouter三问—腾讯真题

作者头像
码上积木
发布于 2020-10-29 08:39:49
发布于 2020-10-29 08:39:49
1.4K00
代码可运行
举报
文章被收录于专栏:码上积木码上积木
运行总次数:0
代码可运行

为了项目解耦,实现模块的独立化,出现了组件化,而组件化中用作模块间通信的重要使者就是ARouter,今天就一起来看看这个神奇的工具。

  • ARouter的原理?
  • ARouter怎么实现页面拦截?
  • 组件化中使用ARouter需要注意什么,或者说怎么正确应用到组件化中呢?

ARouter的原理

首先,我们了解下ARouter是干嘛的?ARouter是阿里巴巴研发的一个用于解决组件间,模块间界面跳转问题的框架。所以简单的说,就是用来跳转界面的,不同于平时用到的显式或隐式跳转,只需要在对应的界面上添加注解,就可以实现跳转,看个案例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

//跳转
ARouter.getInstance().build("/test/activity").navigation();

使用很方便,通过一个path就可以进行跳转了,那么原理是什么呢?

其实仔细思考下,就可以联想到,既然关键跳转过程是通过path跳转到具体的activity,那么原理无非就是把pathActivity一一对应起来就行了。没错,其实就是通过注释,通过apt技术,也就是注解处理工具,把path和activity关联起来了。主要有以下几个步骤:

  • 代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activity.class映射关系的类文件
  • app进程启动的时候会加载这些类文件,把保存这些映射关系的数据读到内存里(保存在map里)
  • 进行路由跳转的时候,通过build()方法传入要到达页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class
  • 然后new Intent方法,如果有调用ARouterwithString()方法,就会调用intent.putExtra(String name, String value)方法添加参数
  • 最后调用navigation()方法,它的内部会调用startActivity(intent)进行跳转

ARouter怎么实现页面拦截

先说一个拦截器的案例,用作页面跳转时候检验是否登录,然后判断跳转到登录页面还是目标页面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @Interceptor(name = "login", priority = 6)
    public class LoginInterceptorImpl implements IInterceptor {
        @Override
        public void process(Postcard postcard, InterceptorCallback callback) {
            String path = postcard.getPath();
            boolean isLogin = SPUtils.getInstance().getBoolean(ConfigConstants.SP_IS_LOGIN, false);
    
            if (isLogin) { 
                // 如果已经登录不拦截
                callback.onContinue(postcard);
            } else {  
                // 如果没有登录,进行拦截
                callback.onInterrupt(postcard);
            }
    
        }
    
        @Override
        public void init(Context context) {
            LogUtils.v("初始化成功"); 
        }
    
    }

    //使用
    ARouter.getInstance().build(ConfigConstants.SECOND_PATH)
                             .withString("msg", "123")
                              .navigation(this,new LoginNavigationCallbackImpl()); 
                              // 第二个参数是路由跳转的回调
         
     
    // 拦截的回调
    public class LoginNavigationCallbackImpl  implements NavigationCallback{
        @Override 
        public void onFound(Postcard postcard) {
    
        }
    
        @Override 
        public void onLost(Postcard postcard) {
    
        }
    
        @Override   
        public void onArrival(Postcard postcard) {
    
        }
    
        @Override
        public void onInterrupt(Postcard postcard) {
         //拦截并跳转到登录页
            String path = postcard.getPath();
            Bundle bundle = postcard.getExtras();
            ARouter.getInstance().build(ConfigConstants.LOGIN_PATH)
                    .with(bundle)
                    .withString(ConfigConstants.PATH, path)
                    .navigation();
        }
    }

拦截器实现IInterceptor接口,使用注解@Interceptor,这个拦截器就会自动被注册了,同样是使用APT技术自动生成映射关系类。这里还有一个优先级参数priority,数值越小,就会越先执行。

怎么应用到组件化中

首先,在公用组件的build.gradle中添加依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dependencies {
    api 'com.alibaba:arouter-api:1.4.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
}

其次,必须在每个业务组件,也就是用到了arouter的组件中都声明annotationProcessorOptions,否则会无法通过apt生成索引文件,也就无法正常跳转了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//业务组件的build.gradle
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}
dependencies {
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
    implementation '公用组件'
}

这个arguments是用来设置给编译处理器的一些参数,这里就把[AROUTER_MODULE_NAME: project.getName()]键值对传了过去,方便Arouter使用apt的时候进行数据处理,也是Arouter库所规定的配置。

然后就可以正常使用了。


Android开发者们,快来关注公众号【码上积木】,每天三问面试题,并详细剖析,助你成为offer收割机。 积累也是一种力量。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android-ARouter
我们上一篇文章是自定义Router,没有看过的小伙伴自定义Router,但今天我们来看一看世面上主流的路由框架-由阿里推出的ARouter.。 参考资料: https://mp.weixin.qq.com/s/hUKEOp3qa4C53F6ZmPuXjQ https://mp.weixin.qq.com/s/UljVdlGQuwooVEJz_rctjw
android_薛之涛
2019/04/17
1.4K0
Android-ARouter
使用ARouter进行Android模块化开发
关于为什么要进行Android模块化开发,网上也已经讲烂了,不过归结起来,大体是可以总结为:在App开发的初期,代码量不大,业务量比较少,一个App作为一个单独的模块进行开发,往往问题不大。但随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,结构越来越臃肿,修改一处代码要编译整个工程,导致非常耗时,这时候最好的办法就是进行模块化拆分。
Android技术干货分享
2019/07/10
1.5K0
ARouter 使用教程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/81036719
程序员徐公
2018/09/17
2K0
ARouter 使用教程
Android项目解耦--路由框架ARouter的使用
随着业务量的增长,客户端必然随之越来越业务和功能模块耦合越来越生,开发人员代码维护成本越来越高。 App一般都会走向组件化、插件化的道路,而组件化、插件化的前提就是解耦,那么我们首先要做的就是解耦页面之间的依赖关系。
静默加载
2020/05/29
2.2K0
一图抵千言《ARouter简明扼要原理分析》
这段代码最终会利用当前类名和规则,拼接成KotlinTestActivity$$ARouter$$Autowired的全类名,然后利用反射传进对象。然后执行inject(this); 然后里面会初始化传输字段序列化服务,然后强转target,开始赋值数据
g小志
2022/03/29
7720
一图抵千言《ARouter简明扼要原理分析》
Android技术栈(二)组件化改造
国内都比较流行开发超级APP,也就是我全都要,什么功能都想加进去,这导致业务逻辑变得越来越复杂.
Android技术干货分享
2019/03/27
5450
Android技术栈(二)组件化改造
“终于懂了” 系列:组件化框架 ARouter 完全解析(一) 原理详解
在我之前的组件化文章《“终于懂了” 系列:Android组件化,全面掌握!》中,提到为了实现组件化要解决的几个问题点,其中 页面跳转、组件间通信 的问题是使用了 ARouter 这个框架来解决的。ARouter确实是专门用于做组件化改造,官方是这么介绍的:
胡飞洋
2022/11/08
3.4K0
“终于懂了” 系列:组件化框架 ARouter 完全解析(一) 原理详解
ARouter源码解析(一)前言ARouter 源码番外
之前对 ActivityRouter 的源码做了一次分析,相信大家对路由框架已经有一个大概的理解了。
俞其荣
2019/01/03
8260
阿里ARouter使用及源码解析(一)
在app的开发中,页面之间的相互跳转是最基本常用的功能。在Android中的跳转一般通过显式intent和隐式intent两种方式实现的,而Android的原生跳转方式会存在一些缺点:
用户3106371
2018/09/12
1.5K0
阿里ARouter使用及源码解析(一)
Android项目解耦--路由框架ARouter源码解析
上一篇文章Android项目解耦--路由框架ARouter的使用讲述了ARouter在项目中的使用,这边文章主要对ARouter的源码进行学习和分析。
静默加载
2020/05/29
1.1K0
深入探究 ARouter
我们只关注重点,LogisticsCenter.init(mContext, executor);,executor是一个线程池。
大发明家
2022/01/15
8200
阿里ARouter路由实现Android模块化开发
从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大,为了降低大型软件复杂性和耦合度,同时也为了适应模块重用、多团队并行开发测试等等需求,模块化在 Android 平台上变得势在必行。阿里 Android 团队在年初开源了他们的容器化框架 Atlas 就很大程度说明了当前 Android 平台开发大型商业项目所面临的问题。
xiangzhihong
2022/11/30
9540
ARouter 在多 module 项目中实战
本文仅作案例演示,方便学习和掌握基础知识,不进行源码级别的探究。下面先明确一下能实现的功能和用到的技术点以及环境。
逆锋起笔
2022/01/11
9921
ARouter 在多 module 项目中实战
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
使用 ARouter 第三方库实现组件化 : https://github.com/alibaba/ARouter
韩曙亮
2023/03/29
2.5K0
【Android 组件化】使用 ARoute 实现组件化 ( 完整组件化项目框架 )
ARouter源码解析(二)前言拦截器解析
前几天对 ARouter 的页面跳转源码进行了分析,趁着今天有空,就讲讲 ARouter 里面的拦截器吧。
俞其荣
2019/01/03
7040
【Android 组件化】使用 ARoute 实现组件化 ( ARoute 初始化 及 界面跳转 源码分析 )
引入了 ARoute 的应用 , 一般会在主应用的 Application 中的 onCreate 方法中初始化 ARoute ;
韩曙亮
2023/03/29
1.2K0
【Android 组件化】使用 ARoute 实现组件化 ( ARoute 初始化 及 界面跳转 源码分析 )
阿里ARouter拦截器使用及源码解析(二)
关于ARouter基本跳转的用法以及源码解析在上篇文章阿里阿里ARouter使用及源码解析(一)已经有过分析,有不清楚的同学可以去看看。本篇文章主要是关于ARouter进阶用法拦截器的使用和分析。
用户3106371
2018/09/12
2.9K0
阿里ARouter拦截器使用及源码解析(二)
编译时注解(三)Arouter源码讲解
项目中我们有时需要跨模块startActivity,但是这样需要配置menifest,不方便。这时就需要阿里的一个路由框架Arouter Arouter的使用就不再多说了。这篇文章主要讲解他的源码
提莫队长
2019/02/21
6840
“终于懂了” 系列:Android组件化,全面掌握!
随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?
胡飞洋
2020/10/23
2.1K0
Android组件化开发思想与实践
链接:https://juejin.im/post/5eb019b8e51d45338806f2c0
陈宇明
2020/12/16
6760
Android组件化开发思想与实践
推荐阅读
相关推荐
Android-ARouter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验