前面已经解析过ARouter的基本用法,还不清楚使用方式的读者请阅读

ARouter的基本用法

ARouter 原理

ARouter就是基于反射和注解来解决这个问题的

ARouter在编译期的时候,利用自定义注解完成了页面的自动注册。代码编译一遍,可以看到ARouter生成下面几个源文件:

加上注解@Route(“/group/name”),注意这里需要至少两层路径(第一个是分组,第二个一般是类名)。

全部都以group的名字为key,以注解生成的不同的group的类的class对象为value放入到一个map中。

用过ARouter路由框架的同学应该都知道,在每个需要对其他module提供调用的Activity中,都会声明类似下面@Route注解,我们称之为路由地址

@Route(path = "/main/main")

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

@Route(path = "/module1/module1main")

public class Module1MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_module1_main);

}

}

路由框架会在项目的编译期通过注解处理器扫描所有添加@Route注解的Activity类,然后将Route注解中的path地址和Activity.class文件映射关系保存到它自己生成的java文件中。为了让大家理解,我这里来使用近乎伪代码给大家简单演示一下。

public class MyRouters{

//项目编译后通过apt生成如下方法

public static HashMap getRouteInfo(HashMap routes) {

route.put("/main/main", MainActivity.class);

route.put("/module1/module1main", Module1MainActivity.class);

route.put("/login/login", LoginActivity.class);

}

}

这样我们想在app模块的MainActivity跳转到login模块的LoginActivity,那么便只需调用如下:

//不同模块之间启动Activity

public void login(String name, String password) {

HashMap route = MyRouters.getRouteInfo(new HashMap);

LoginActivity.class classBean = route.get("/login/login");

Intent intent = new Intent(this, classBean);

intent.putExtra("name", name);

intent.putExtra("password", password);

startActivity(intent);

}

实际上它的核心思想跟上面讲解是一样的,我们在代码里加入的@Route注解,会在编译时期通过apt生成一些存储path和activity.class映射关系的类文件,然后app进程启动的时候会加载这些类文件,把保存这些映射关系的数据读到内存里(保存在map里),然后在进行路由跳转的时候,通过build()方法传入要到达页面的路由地址,ARouter会通过它自己存储的路由表找到路由地址对应的Activity.class(activity.class = map.get(path)),然后new Intent(context, activity.Class),当调用ARouter的withString()方法它的内部会调用intent.putExtra(String name, String value),调用navigation()方法,它的内部会调用startActivity(intent)进行跳转,这样便可以实现两个相互没有依赖的module顺利的启动对方的Activity了。

Activity类上加上@Route注解之后,便可通过apt生成对应的路由表。

APT是Annotation Processing Tool的简称,即注解处理工具。apt是在编译期对代码中指定的注解进行解析,然后做一些其他处理(如通过javapoet生成新的Java文件)。

我们常用的ButterKnife,其原理就是通过注解处理器在编译期扫描代码中加入的@BindView、@OnClick等注解进行扫描处理,然后生成XXX_ViewBinding类,实现了view的绑定。

android arouter原理和作用,ARouter原理剖析相关推荐

  1. Android平台页面路由框架ARouter原理

    本次分享将主要围绕以下几个方面: 一.为什么需要路由框架 二.ARouter的技术方案 三.使用ARouter的最佳实践 四.未来开发计划 一.为什么需要路由框架 原生的路由方案存在的问题 首先谈一谈 ...

  2. 从 Android 6.0 源码的角度剖析 Binder 工作原理 | CSDN 博文精选

    在从Android 6.0源码的角度剖析Activity的启动过程一文(https://blog.csdn.net/AndrExpert/article/details/81488503)中,我们了解 ...

  3. 从Android 6.0源码的角度剖析View的绘制原理

    在从Android 6.0源码的角度剖析Activity的启动过程和从Android 6.0源码的角度剖析Window内部机制原理的文章中,我们分别详细地阐述了一个界面(Activity)从启动到显示 ...

  4. 【Android 热修复】热修复原理 ( 合并两个 Element[] dexElements | 自定义 Application 加载 Dex 设置 | 源码资源 )

    文章目录 一.合并两个 Element[] dexElements 二. 完整修复包加载工具类 三. 源码资源 一.合并两个 Element[] dexElements 在 [Android 热修复] ...

  5. Android P SELinux (三) 权限检查原理与调试

    Android P SELinux (一) 基础概念 Android P SELinux (二) 开机初始化与策略文件编译过程 Android P SELinux (三) 权限检查原理与调试 Andr ...

  6. Android dp方式的屏幕适配-原理(后期补充完整讲解)

    Android dp方式的屏幕适配-原理 传统所说的屏幕适配,其实是针对不同屏幕的UI尺寸适配,即在编写页面时使用了具体的dp.sp值后导致的其他问题. 我之前写过一些相关的文章和工具插件,也收到了很 ...

  7. 读书笔记-Android进阶指北-Native Binder原理

    什么是 Binder: Binder 是基于 OpenBinder 实现的,Binder 通信采用内存映射的方式来实现跨进程数据传递.是一种 IPC 机制. 为什么要了解 Binder: Androi ...

  8. volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...

  9. Bundler 的作用及原理

    Bundler 的作用及原理 翻译 · yesmeck · Created at one year ago · Last by teacafe2000 Replied at one year ago  ...

最新文章

  1. LeetCode简单题之两个相同字符之间的最长子字符串
  2. java编码-多重(乱码)
  3. 辽宁计算机应用考试报名时间,2021辽宁上半年计算机应用水平考试报名时间及方法...
  4. Mybatis-generator的使用
  5. 使用Java打印三角形
  6. 奥西750服务器系统,奥西TDS750驱动
  7. opengl模型加载
  8. vue 实现点击插入输入框_vue把输入框的内容添加到页面的实例讲解
  9. js截取指定字符串后面的所有字符
  10. iOS平台手机银行App大多存安全风险漏洞
  11. (转)FFmpeg 基本用法
  12. 优学院计算机基础网课答案,最新网课答案2020优学院大学计算机基础
  13. Java中int的取值范围的原因
  14. ix | pandas读取表格后的行列取值改值操作
  15. 爬虫,爬取链家网北京二手房信息
  16. 基于74ls194的m序列发生器(硬件)
  17. 怎样在ubuntu 14.04上安装轻量级的Budgie桌面
  18. 电大计算机应用基础课程形成考核,2016年电大-电大计算机应用基础形成性考核.doc...
  19. PMO、QA、EPG各自的职能划分及关系是什么?
  20. 【office培训】【王佩丰】Excel2010视频教程第1讲:认识Excel 2010

热门文章

  1. 在 Android 模拟器上运行 ARM 应用
  2. 长城宽带恶意流量劫持证据分析及防范
  3. 2022世界人工智能大会 “智慧金融与数字员工”分论坛在沪成功举办
  4. python求某个函数的反函数_如何用sympy求快速sigmoid函数的逆函数?
  5. 内存检测工具Dr.Memory在Windows上的使用
  6. 【Idea】JUnit单元测试%MODULE_WORKING_DIR%' does not exist
  7. 人事办公考勤工资管理系统(ssm,mysql)
  8. 机器学习与计算机视觉入门项目——视频投篮检测(一)
  9. 如何在Win10上安装爬虫框架Scrapy
  10. 基于matlab信道均衡仿真,基于MATLAB的数字自适应信道均衡器仿真研究.doc