【Android】ARouter——强大的路由框架

引言

在我们使用组件化的时候,活动并不在一个模块当中,但是毕竟是一个程序我们需要在不同的模块之间进行跳转,我们会首先想到在需要进行通信的模块下都添加相应的依赖就可以解决这个问题,但这样无疑增加了各个组件之间的耦合性。因此会想到如何能够在不添加依赖的情况下还行进行各个组件之间的通信,接下来就认识一个强大的工具——ARouter

路由认知

路由框架是用于管理应用程序中不同组件(如页面、活动、模块等)之间导航和通信的工具。它通常提供了一种简化的方式来处理路由、参数传递和组件间的调用,使得开发者能够更加方便地管理应用的结构和导航。

他就像是邮局,将寄信人与接收人联系起来,接下来就来看看它是如何实现的。

自定义路由

这里是为了让大家更好的理解ARouter。路由是为了实现各个组件之间的通信,不就属于上面的基础组件层,我们在基础组件层新建一个模块名为librouter,此模块下新建一个Router类去实现ARouter的功能。

我们要保证程序当中只有一个路由,即使路由为单例模式,因此采用单例模式进行创建:

public Router() {
}
public final static class Holder {static Router INSTANCE = new Router();
}
public static Router getInstance() {return Holder.INSTANCE;
}

Router的作用就是管理所有的类,可以协调使用这些类,如何进行存储。不同的包名下有不同的多个Activity:

在这里插入图片描述

static final Map<String, Map<String, Class<?>>> groupMap = new HashMap<>();
final Map<String, Class<?>> routeMap = new HashMap<>();

首先就会想到如何进行存储这些不同的类:

public void register(String path, Class<?> clz) {//我们所要存储的就是不同的Activity与相应的路径与包名,包名是包括在路径之下的,因此所要传进的就是一个字符串,一个class,我们要将路径下的包名解析出来所以使用'/',在进行注册的时候://Router.getInstance().register("/main/MainActivity", MainActivity.class);String[] strArray = path.split("/");if (strArray.length > 2) {//我们取出包名,判断这个包名有没有注册过,当注册过的时候我们就将其取出来,否则就创建出一个新的,将其放到groupMap当中,最后将其添加到routeMap当中,即完成注册String groupName = strArray[1];Map<String, Class<?>> routeMap = null;if (groupMap.containsKey(groupName)) {routeMap = groupMap.get(groupName);} else {routeMap = new HashMap<>();groupMap.put(groupName, routeMap);}routeMap.put(groupName, clz);}
}

注册类的方法我们就写完了,接下来就是给所有的活动进行注册了:

在App下新建一个MyApplication,我们想要随程序的启动就进行注册,因此将注册方法写道onCreate当中,并将其添加到AndroidManifest.XML文件当中:

public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();Log.d("TestTest", "我进行了注册");Router.getInstance().register("/main/MainActivity", MainActivity.class);Router.getInstance().register("/loginUp/LoginUpActivity", LoginUpActivity.class);}
}

在这里插入图片描述

这样就注册完毕了,我们做了这么多的准备不就是为了进行不同组件之间活动的跳转吗,看看跳转活动如何写:

public void startActivity(Activity activity, String path) {String[] strArray = path.split("/");if (strArray.length > 2) {String groupName = strArray[1];String routeName = path;Map<String, Class<?>> group = null;if (groupMap.containsKey(groupName)) {group = groupMap.get(groupName);}if (group != null && group.containsKey(routeName)) {Class<?> clz = group.get(routeName);activity.startActivity(new Intent(activity, clz));}}
}

对于前面的代码就不做过多的解释了与上面注册的代码是一样的,后面的代码也很好理解,就大致说一下思路吧,我们根据传进来的路径名即为我们所要开启的活动的路径,先判断我们有没有注册这个包名,根据包名取出对应的此包下的活动集合,在判断是不是有此路径的活动,当有的时候我们就可以取出对应的活动,从而进行活动的跳转。

Router.getInstance().startActivity(LoginUpActivity.this, "/main/MainActivity");

在登录的组件当中无需进行主活动的依赖就可以实现跳转了。

使用路由——ARouter

通过上面自定义实现了路由框架,你对ARouter’的实现已经有了大致的了解,接下来就正式的认识路由插件——ARouter。

首先需要对其添加依赖:

implementation("com.alibaba:arouter-api:1.5.2")
annotationProcessor("com.alibaba:arouter-compiler:1.5.2")

我们第一个还想到的是进行注册,此时我们只需要给活动添加注解即可完成注册:

在这里插入图片描述
在这里插入图片描述

这段代码是 Gradle 构建配置中的一部分,用于设置 Java 编译选项,特别是针对注解处理器(Annotation Processors)的配置。在这个特定的代码段中,配置了传递给注解处理器的参数。以下是详细解释:

javaCompileOptions

javaCompileOptions 是一个配置块,用于定义 Java 编译过程中的选项。这些选项包括编译时使用的 Java 版本、注解处理器的配置等。

annotationProcessorOptions

annotationProcessorOptionsjavaCompileOptions 内的配置块,专门用于设置注解处理器的选项。在这个配置块中,你可以指定注解处理器需要的参数、处理器的类路径等。

arguments

argumentsannotationProcessorOptions 内的属性,它允许你为注解处理器传递一组键值对参数。这些参数可以在注解处理器的执行过程中被读取和使用。

AROUTER_MODULE_NAME: project.getName()

在这个例子中,arguments 属性被设置为一个包含单个键值对的 Map。键是 AROUTER_MODULE_NAME,值是通过调用 project.getName() 方法获取的当前项目的名称。

  • AROUTER_MODULE_NAME 是注解处理器期望的一个参数键,它用于接收传递给它的值。
  • project.getName() 是 Gradle API 提供的方法,返回当前项目的名称。这个名称通常对应于项目在多模块构建中的路径,例如 :app:library:module1

总结

这段配置的目的是为 ARouter的注解处理器提供项目的名称作为参数。这样,ARouter 可以根据项目的名称来执行特定的逻辑,比如生成路由表时区分不同模块。这种配置方式使得注解处理器能够更加灵活地适应不同的项目和模块。

在总体的gradle.propertise文件当中添加:
在这里插入图片描述

我们进行了注册以及配置的相关操作,接下来与上面我们自定义的一样需要对其初始化:

public class MyApplication extends Application {//ARouter调用开关private boolean isDebugARouter=true;@Overridepublic void onCreate() {super.onCreate();if (isDebugARouter) {// 打印日志ARouter.openLog();// 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)ARouter.openDebug();}ARouter.init(this);}
}

使用他进行跳转操作吧:

ARouter.getInstance().build("/main/MainActivity").navigation();

接下来运行程序就可以从登陆界面跳转到主活动界面了。

当然,我们不单单要实现不同组件之间活动的跳转,还要传对应的参数,ARouter使用的是建造者的方式,因此我们只需要对其进行build即可:

ARouter.getInstance().build("/main/MainActivity").withString("key1","我是传过来的字符串").withBoolean("key2", false)//对user进行序列化,此时要么进行强转为序列化,要么在user类当中implements Serializable去实现序列化.withSerializable("key3", new user("海绵宝宝", 5))//navigation() 方法用于根据指定的路由路径启动目标 Activity 或传递参数。它是链式调用的最后一个环节,用于触发实际的导航行为。.navigation();

此时就发送完毕了,要如何进行接收呢?

@Route(path = "/main/MainActivity")
public class MainActivity extends AppCompatActivity {@Autowired(name = "key1")public String name;@Autowired(name = "key3")public user user;@Overrideprotected void onCreate(Bundle savedInstanceState) {......//inject(this); 是 ARouter 提供的一个方法,用于将通过路由传递的参数注入到当前对象中ARouter.getInstance().inject(this);Log.d("TestTest", name + "");if (user != null) {Log.d("TestTest", user.getName() + user.getAge());}}
}

查看打印日志:
在这里插入图片描述

此时就将数据传输过来了!

文章到这里就结束了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Doris 现行版本 Docker-Compose 运行教程

特别注意&#xff01;Doris On Docker 部署方式仅限于开发环境或者功能测试环境&#xff0c;不建议生产环境部署&#xff01; 如有生产环境或性能测试集群部署诉求&#xff0c;请使用裸机/虚机部署或K8S Operator部署方案&#xff01; 原文阅读&#xff1a;Apache Doris 现行版…

springboot363高校竞赛管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校竞赛管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…

RAG数据拆分之PDF

引言RAG数据简介PDF解析方法及工具代码实现总结 二、正文内容 引言 本文将介绍如何将RAG数据拆分至PDF格式&#xff0c;并探讨PDF解析的方法和工具&#xff0c;最后提供代码示例。 RAG数据简介 RAG&#xff08;关系型属性图&#xff09;是一种用于表示实体及其关系的图数据…

labelimg每次标注的时候自动导入预设标签

背景说明 最近在做一个视频行为识别项目的时候&#xff0c;已经采集了视频样例片段&#xff0c;需要对视频的行为动作进行图片标注&#xff0c;自己很快完成了视频到图片的分割&#xff0c;在进行图片标注的时候&#xff0c;选用的标注工具是labelimg,由于视频转成图片后数量很…

Java对接AI大模型

随着AI大模型技术的升起,人们越来越感觉到生活上的便捷以及人机对话照进现实.什么是大模型呢? 大模型&#xff08;Large Model&#xff09;&#xff0c;通常是指参数量非常庞大的深度学习模型&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#…

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口&#xff0c;此处没有对用户手机号和验证码等信息进行加密传输&#xff0c;可以很简单的截取并开展一些合法的…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

基于Springboot开发的时光兼职网

一、功能介绍 时光兼职网包含管理员、用户、商家三个角色以及前后台系统。 前台系统功能 首页、兼职信息推荐、查看更多等 职位申请、申请日期、上传简历、点击下载简历、留言反馈等 个人中心、上传图片、更新信息等 后台系统功能 用户登录&#xff1a; 个人中心、修改密码…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶&#xff08;Horner&#xff09;多项式的错误计算。 例1. 用秦九韶&#xff08;Horner&#xff09;算法计算&#xff08;一百零七&#xff09;例1中多项式 直接贴图吧&#xff1a; 这样&#xff0c;MATLAB 给出的仍然是错误结果&#xff0c;因为准…

代码美学3:RGB转化+MATLAB制作渐变色

RGB颜色转化器&#xff08;转换成matlab可以读取的形式&#xff09; n input(请输入 n&#xff1a;); color_matrix cell(1, n); for i 1:nR input(请输入 R 值&#xff1a;);G input(请输入 G 值&#xff1a;);B input(请输入 B 值&#xff1a;);color_matrix{i} [R/2…

kafka数据在服务端时怎么写入的

学习背景 接着上篇&#xff0c;我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前&#xff0c;我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群&#xff0c;我们在这个集群上创建一个topic叫做shitu-topic&…

rabbitmq原理及命令

目录 一、RabbitMQ原理1、交换机&#xff08;Exchange&#xff09;fanoutdirecttopicheaders&#xff08;很少用到&#xff09; 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…

Kali Linux怎么开python虚拟环境

相信很多朋友再学习的过程中都会遇到一些pip失效&#xff0c;或者报错的时候&#xff0c;他们要求我们要使用虚拟环境&#xff0c;但是不知道怎么搭建&#xff0c;下面这篇文章就来告诉你如何搭建虚拟环境&#xff0c;这个方法在所有Linux的服务器都通用&#xff0c;就两行命令…

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代&#xff0c;程序开…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件&#xff0c;是对原生组件的封装 原生组件&#xff1a;Android或ios内的组件核心组件&#xff1a;RN中常用的&#xff0c;来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图&#xff1b;在 iOS 开发…

视觉语言动作模型VLA的持续升级:从π0之参考基线Octo到OpenVLA、TinyVLA、DeeR-VLA、3D-VLA

第一部分 VLA模型π0之参考基线Octo 1.1 Octo的提出背景与其整体架构 1.1.1 Octo的提出背景与相关工作 许多研究使用从机器人收集的大量轨迹数据集来训练策略 从早期使用自主数据收集来扩展策略训练的工作[71,48,41,19-Robonet,27,30]到最近探索将现代基于transformer的策略…

C与指针。

目录 1_指针理解 1.1变量的值 1.2变量的地址 1.3指针 1.4取变量的地址 2_分析指针 2.1分析指针变量的要素 2.2根据需求定义指针变量 3_指针的使用 3.1指针对变量的读操作 3.2指针对变量的写操作 4_指针占用空间的大小与位移 4.1指针占用空间的大小 4.2指针的位移…

单片机学习笔记 15. 串口通信(理论)

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

树莓派5+文心一言 -> 智能音箱

一、简介 效果&#xff1a;运行起来后&#xff0c;可以连续对话 硬件&#xff1a;树莓派5、麦克风、音箱&#xff0c;成本500-1000 软件&#xff1a;snowboy作为唤醒词、百度语音作为语音识别、brain作为指令匹配、百度文心一言作为对话模块、微软的edge-tts语音合成... 二…

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…