Android组件化中的Arouter学习

2024-02-01 22:52

本文主要是介绍Android组件化中的Arouter学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

~~在这里插入图片描述~~
假设现在有两个业务组件登录和问答模块之间需要进行通信,可能会想到用反射的方式,是可以但是会影响性能,而写的代码比较多类名这些要记清楚。
路由可以看做表,每个map对应一张表
我们可以试着这么写,完成MainActivity跳转到LoginActivity,LoginActivity再跳转到WendaActivity。
新建一个libRouter的library
在这里插入图片描述
新建一个Router类进行路由表的注册和启动

class Router private constructor() {//先通过组名找到map再通过map找到对应的类名final val groupMap: HashMap<String, HashMap<String, Class<*>>> = HashMap()//最终将LoginActivity,WendaActivity注册到routeMap里面去final val routeMap:HashMap<String,Class<*>> =HashMap()object Holder {var INSTANCE = Router()}fun getInstance(): Router {return Holder.INSTANCE}//注册fun register(path:String,clz:Class<*>){val strArray: Array<String> = path.split("/").toTypedArray()if(strArray.size>2){var groupName:String=strArray[1]var routeName=pathvar group:HashMap<String,Class<*>>?=nullif(groupMap.containsKey(groupName)){group=groupMap.get(groupName)}if(group==null){group= HashMap()groupMap.put(groupName,group)}if(group!=null){group.put(routeName,clz)}}}//启动fun startActivity(activity:Activity,path: String){val strArray: Array<String> = path.split("/").toTypedArray()if(strArray.size>2){var groupName:String=strArray[1]var routeName=pathvar group:HashMap<String,Class<*>>?=nullif(groupMap.containsKey(groupName)){group=groupMap.get(groupName)}if(group!=null && group.containsKey(routeName)){val clz=group.get(routeName)activity.startActivity(Intent(activity,clz))}}}}

MainActivity跳转LoginActivity

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)Router.Holder.INSTANCE.startActivity(this,"/login/LoginActivity")}
}

LoginActivity跳转WendaActivity

class LoginActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_login)}fun onClickView(view: View) {Router.Holder.INSTANCE.startActivity(this,"/wenda/WendaActivity")}
}

loginActivity布局增加点击事件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LoginActivity"><TextViewandroid:onClick="onClickView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="LoginActivity"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

Application注册路由表

class SunBeachApplication:Application() {override fun onCreate() {super.onCreate()Router.Holder.INSTANCE.register("/login/LoginActivity",LoginActivity::class.java)Router.Holder.INSTANCE.register("/wenda/WendaActivity",WendaActivity::class.java)}
}

运行app从MainActivity跳转到LoginActivity
在这里插入图片描述
点击LoginActivity跳转到WendaActivity
在这里插入图片描述

但也有问题并且如果要跳转的Activity比较多,Application里的onCreate方法需要注册比较多
如果我们在Router类进行添加的话就会出现无法识别出几个类的问题
在这里插入图片描述
所以我們需要一个注解处理器,由Activity去扫描,扫描到添加进来。
这个时候我们再来看一下Arouter是怎么实现的。
Arouter核心原理:
在这里插入图片描述
当我们使用Arouter的注解处理器的时候,就会帮我们生成相应的类,Arouter$$Group $ $login就是login的group,而Arouter $ $Root $ $login就是去查找到group并调用group的方法
在这里插入图片描述

可以看到Arouter$ $ Root $ $ login通过传递routes将Arouter$ $Group $ $login的class添加到Map中。
在这里插入图片描述

而Arouter$ $Group $ $login里当调用了loadInto方法的话就会将LoginActivity注册进来
在这里插入图片描述
将相应的信息放到RouteMeta当中,RouteMeta就是一个包装类,封装了当前的一些信息,主要通过RouteMeta找到对应的class进行跳转或者参数传递。
当我们在使用Arouter的时候都需要进行init()初始化
在这里插入图片描述

这个_ARouter就是路由控制器。
在这里插入图片描述
在这里插入图片描述
这里主要是获取之前保存的一些信息,而不用for循环去遍历,这样下次可以直接用。
第一次通过getFileNameByPackageName把指定包下面的所有文件找出来,也就是生成的下面包的文件
在这里插入图片描述
也指定了要找对应包名的文件
在这里插入图片描述
并返回到routerMap的集合里去
在这里插入图片描述
然后再去遍历routerMap
在这里插入图片描述
而当第二次,缓存到本地后,直接读取拿到信息,就不用再去找。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个时候在遍历routerMap的时候就会拿到这个root文件去调用loadInto方法
在这里插入图片描述
在这里插入图片描述
loadInto方法的具体实现也就是生成的那些类中
在这里插入图片描述
它会找到生成的group直接put到分组当中,分组当中提供了一个方法
在这里插入图片描述
通过这个方法可以将path,class这些信息放到一个map当中。因为生成文件中有很多group,有grouplogin,groupmain,要找到这些group调用loadInto方法,这样我们通过传入path路径,就能找到RouteMeta,就可以拿到class。
而当我们要去跳转,这个时候会进行build操作
在这里插入图片描述
在这里插入图片描述
会返回一个Postcard对象里面也包含了一些信息
在这里插入图片描述
接着继续点进去发现navigation这个方法调用了LogisticsCenter.completion(postcard)
在这里插入图片描述

在这里插入图片描述
调用loadInto这个方法其实也就是对应下面的方法。
在这里插入图片描述

这篇关于Android组件化中的Arouter学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668729

相关文章

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J