android 多态如何组件化,Android组件化之子模块之间通信方案

1 背景

Android开发中你的模块(Module)一般只有一个app主模块,随着功能不断扩展你会发现一个模块的缺点就是各种业务高度耦合,你就想测试登录模块,那么你可能会把支付模块也编译进去了,代价就是编译耗时,降低效率。

大牛就提出了组件化开发的概念,假如一个App包括登录,选购,支付三个模块,那么就分成三个app,一个用来做登录,一个用来展示商品让用户选购,一个用来做支付,这样互相不影响而且编译的话只会编译当前模块的代码,提高了时间效率。

具体如何让自己的App成为组件化App请看这位博主的博客

Android组件化开发

2 原理

既然知道了组件化开发,那么我们看下下面这张图

37b0423dae4acc2cb7b389ac4fc40576.png

箭头表示依赖关系,举例:BaseModule指向module1-login模块、Module2-Pay模块,表示在Login、Pay的build.gradle文件中包含对baseModule的依赖(即下面代码)

compile project(path: ':baseModule')

app是我们的主模块,module1模块是登录模块,module2是支付模块,baseModule是基础模块,baseModule的作用是搭建模块间的桥梁,让所有模块共享资源,举个例子:我把网络请求框架,图片缓存框架保存在baseModule里面,这样module1和module2都依赖baseModule即可,每个module只关心做本业务的事就可以了,所有模块都需要的事情交给baseModule去做即可。

主模块可以和下面的所有子模块通信调用,但是如果两个子模块之间需要调用该怎么弄呢?因此,我们需要搭建模块间的桥梁,下面就是今天要说的Android模块间通信了

假如登录模块的登录页面验证完毕要跳转到支付模块的支付页面应该如何做呢?

哼,这不简单吗?直接startAcitivity进行跳转不就可以吗?

哦!不对,module1没有添加对module2的依赖,所以我无法获取到module2中的PayActivity这个类!

哼,难得倒我?Class c=Class.forName(“类名”),反射直接拿到类,module1引用baseModule的方法进行跳转!

不错不错,你会使用反射说明已经很有潜力解决这个问题了,让我们来看下这个方法的问题出在哪里——你无法获取这个类的名字,当我们合作开发的时候我们是不知道其他人的模块里面的类定义是什么名字的(即使你知道名字,万一有一天他改了包结构,类名变了呢?你的反射就会抛出异常了)

我知道这点小困难是难不住你的

那这样吧,module1的开发者和module2的开发者说好,我们用一个标志来表示module2的支付页面吧,比如叫

pay,我给你传的参数是pay你就跳到你定义的支付页面,test就跳转到你的测试页面,我不用管也不想管你以后怎

么定义你的类名和包名了

说干就干,我们在baseModule中定义一个接口用于表示要进行跳转的标志,斜杠前面表示的模块名,后面是表示的标志(为什么这样定义后面会解释)

下面是demo的效果,主页中直接开启module1,然后跳转至module2,两个子module相互点击跳转:

d957c4a864cebfc00339b67085fd88d7.png

让我们整理接下来的实现思路:

module1和module2均会实现baseModule的跳转分发TaskDistribution接口,接口第二个参数会传递一个标志给

baseModule的接口TaskDistribution,Distributor为跳转分发的实现类,里面利用反射创建各个子module的

跳转类,据此就可以找到各个子module的页面类,页面类会根据这个标志flag进行判断跳转

解析:baseModule不依赖module2,他也是无法获取支付类的,要想跳转到支付类,只能把跳转的任务交给module2,我们定义“module1/login”是为了保证baseModule分发标志的时候可以发给相应的模块

接上面的分发跳转任务这件事,那么module2中应该有一个类是要接受消息进行处理并且跳转到相应的页面的,因为每个模块有有可能接受或者发送消息,所以都需要定义一个这样的类,这样我们就会想到在baseModule中定义一个收消息处理的接口,让每个模块实现这个接口去跳转到本模块的相应页面

base中的消息转发接口:

/**

* Description 每个模块分发标志到对应的页面

*/

public interface TaskDistribution {

void distribution(Context context, String flag, Object... objects);

}

子模块1的跳转实现:

public class Taskimp1 implements TaskDistribution{

@Override

public void distribution(Context context, String flag, Object... objects) {

if(flag.endsWith("login")){

//跳转到登录页面

//context.startActivity(...);

}

if(flag.endsWith("login")){

Intent intent = new Intent(context, ModuleOneActivity.class);

context.startActivity(intent);

}

}

}

子模块2的跳转实现:

public class Taskimp2 implements TaskDistribution {

@Override

public void distribution(Context context, String flag, Object... objects) {

if(flag.endsWith("pay")){

Intent intent = new Intent(context, ModuleTwoActivity.class);

context.startActivity(intent);

}

}

}

到这里仅解决了任务分发到各个子module里面后的启动activity的逻辑,但是在baseModule中怎么拿到各个子工程的引用呢?

新的问题来了…..你是baseModule,你怎么可能拿到Taskimp2和Taskimp1两个类呢?你不依赖他们,而是他们依赖于你呢!

天无绝人之路!

那些有潜力的小伙子终于到你们大显身手的时候了,反射派上用场了!既然我拿不到每个类的名字,那我拿到转发器Taskimp1、Taskimp2的类名总可以了吧?(注意为什么拿转发器而不是类的名字,以为类是很多的,我们不可能知道所有的类的名字,但是我们只定义一个转发器,这个是固定的,所以获取转发器的名字更为现实)

baseModule利用反射获取到非依赖的类全限定名,进行跳转转发:

/**

* Description 用于获取模块转发器的类名

*/

public class Distributor {

private static HashMaphashMap = new HashMap<>();

private static TaskDistribution taskDistribution;

public static void init() {

hashMap.put("m1", "ctrip.module1.Taskimp1");

hashMap.put("m2", "ctrip.module2.Taskimp2");

}

private static void getTaskDistribution(String flag) {

try {

Class c = null;

if (flag != null && flag.startsWith("module1")) {

c = Class.forName(hashMap.get("m1"));

}

if (flag != null && flag.startsWith("module2")) {

c = Class.forName(hashMap.get("m2"));

}

taskDistribution = (TaskDistribution) c.newInstance();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

}

}

public static void turn2Acitivity(Context context, String flag, Object... objects) {

getTaskDistribution(flag);

taskDistribution.distribution(context, flag, objects);

}

}

这个Distributor我们把所有的方法耦合到一个类里面其实是不太好的,比如hashMap用不用呢?比如能不能自由选择添加module而不是init把所有的module都添加进去呢?完全自己可以根据业务需求扩展,但是源头就是在这个类中。

总结下来我们就会发现这个模块间通信其实用的就是:反射+多态

项目地址:https://github.com/buder-cp/DesignPattern/tree/master/Android-Module-Protocol-master

参考:https://blog.csdn.net/LosingCarryJie/article/details/78760204

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

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

相关文章

unity android sd卡路径,一、文件与路径——2、unity路径特点写法和文件读写全攻略...

1、Unity中各路径和目录的对应关系image.png其中&#xff0c;安卓中的路径是有两种分支的image.png在打包面板中&#xff0c;有个Write Access当我们选择Internal Only就是表示沙盒路径&#xff0c;/data/data/com.xxx.xxx/对应的Android方法为 getFilesDir()当我们选择SDCard时…

html 图片行内剧中,HTML入门(转义字符、行内样式和块级元素、定位、锚点、跑马灯标签、图片标签、表格标签的讲解)...

一、转义字符由特殊字符包裹的文本 会当做标签去解析对应不换行空格对应全角空格 em是字体排印学的计量单位&#xff0c;相当于当前指定的点数。其占据的宽度正好是1个中文宽度&#xff0c;而且基本上不受字体影响。<对应<>对应>二、行内元素和块级元素1.块级标签默…

html scale方法的作用,HTML Canvas scale() 方法

实例绘制矩形&#xff0c;放大到 200%&#xff0c;然后再次绘制矩形&#xff1a;YourbrowserdoesnotsupporttheHTML5canvastag.JavaScript&#xff1a;var cdocument.getElementById("myCanvas");var ctxc.getContext("2d");ctx.strokeRect(5,5,25,15);ctx…

html屏幕输出笔记本,笔记本怎样外接显示器 笔记本外接显示器方法【详解】

摘要&#xff1a;笔记本电脑怎样外接显示器?一些用户用惯了大屏台式电脑的朋友&#xff0c;改用笔记本玩游戏&#xff0c;看电影等开始会很不习惯&#xff0c;由于笔记本的屏幕与键盘相比台式机要小上一大截。如果身边有显示器或者液晶电视的话&#xff0c;不妨动手体验下笔记…

江陵中学2021高考成绩查询,2021高考序幕拉开 荆州38080名考生赴考

十年寒窗磨一剑&#xff0c;只待今朝问鼎时&#xff0c;6月7日上午&#xff0c;2021年全国高考正式拉开序幕&#xff0c;荆州3.8万余名考生迎来人生大考。上午8点&#xff0c;在湖北省沙市中学考点周围&#xff0c;不少身着红色送考服的班主任们正在给考生们发放准考证&#xf…

排球制作html,MAYA打造排球建模教程

这篇教程向悠悠之家的朋友们介绍用MAYA打造排球模型的过程&#xff0c;制作很简单&#xff0c;希望对刚学习MAYA建模的朋友们有所帮助&#xff0c;我们先看看最终的效果图&#xff1a;你们一定学过很多创建一个球的技巧&#xff0c;但在这个入门教学里面&#xff0c;我们将要学…

计算机主机箱前后都有什么,目前四种热门的主机机箱设计都有哪些优缺点?

在DIY里面机箱算是最没技术含量的产品之一&#xff0c;不过它却是与DIYer接触时间最长的东西。气味大师每天都会按下机箱开机键&#xff0c;也会空余时间瞄上几眼。机箱确实是对DIY影响最大的产品之一&#xff0c;今天我来盘点一下2018年见过的几个主流机箱设计方案。说是机箱设…

计算机自然语言的中国科学家,中科院教授王斌加入小米 任自然语言处理首席科学家...

王斌新浪科技讯 8月28日上午消息&#xff0c;小米新经济研究中心发布微信文章称&#xff0c;中国科学院信息工程研究所研究员、博士生导师王斌已于8月20日正式加入小米集团&#xff0c;任AI实验室自然语言处理(Natural Language Processing&#xff0c;NLP)首席科学家&#xff…

springcloud 相同服务名_浅谈分布式与微服务

分布式和微服务是什么关系&#xff1f;简单来说&#xff0c;分布式和微服务的概念比较相似&#xff0c;分布式属于微服务。但是分布式和微服务在架构、作用和粒度上有所区别。因此&#xff0c;两者的关系是既相互联系又相互区别。本文主要带大家认识分布式和微服务&#xff0c;…

bat 变量 文件内容第一行_VBA基础入门(38)FSO生成bat文件后执行的实例

1.首先&#xff0c;我们回顾下FSO是什么&#xff1f;文件系统对象FSO的英文全称是File System Object &#xff0c;这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法。通过采用object.method这种在面向对象编程中广泛使用的语法&#xff0c;将一系列操作文件…

ps怎么更改背景图层大小_PhotoShop处理图层的一些技巧方法、PS图层处理教程

一、了解图层以及为什么它们如此有用。1.在“图层”面板中查看和选择图层2.层包含组成分层文件的图像&#xff0c;文本或对象。它们使您可以在一层上移动&#xff0c;编辑和使用内容&#xff0c;而不会影响其他层上的内容。3.图层在“ 图层”面板中按堆栈排列&#xff0c;该面板…

使用计算机画画需要什么软件,专业电脑绘画用的是什么工具?

满意答案srCDG3SL62013.11.13采纳率&#xff1a;57% 等级&#xff1a;12已帮助&#xff1a;11125人电脑硬件配置(CPU,内存&#xff0c;显卡等)越高&#xff0c;绘制大图时&#xff0c;软件不会卡。就会画的很流畅。特别是Painter&#xff0c;模拟自然画笔越真实&#xff0c;…

中如何移动物体在画面中的位置_组合柜摆在客厅中什么位置最旺运?客厅中,财位是如何确定的?...

组合柜摆在客厅中什么位置最旺运&#xff1f;组合柜在风水中的重要性不如沙发&#xff0c;但要注意的宜忌事项也有很多。风水上讲高者为山&#xff0c;低者为水&#xff0c;有高有低&#xff0c;有山有水&#xff0c;才符合风水原理。在客厅中&#xff0c;低的沙发是水&#xf…

计算机概论在线阅读,计算器概论 or 计算机概论

计算机硬件的五大单元输入单元、输出单元、CPU内部控制单元、算数逻辑单元、主存储器。中央处理器 CPU Central Processing UnitCPU 的种类精简指令集 Reduced Instruction Set Computing, RISCSun SPARCIBM Power Architecture复杂指令集 Complex Instruction Set Comp…

四川大学计算机学院赵怡,【喜讯】我校计算机学院学子在蓝桥杯大赛全国总决赛中再获佳绩...

在第十一届蓝桥杯“全国软件和信息技术专业人才大赛”省赛上&#xff0c;我校选手面对包括北京大学、清华大学、上海交通大学、北京航空航天大学、武汉大学、西安交通大学、北京理工大学、四川大学、电子科技大学、吉林大学、东北大学等在内的1200余所高校&#xff0c;6万余名顶…

2002勘察设计收费标准_上海装修设计师的收费标准是什么?

目前家装行业的发展趋势全是特别迅速的&#xff0c;一点都不落后于房地产业的发展趋势&#xff0c;因此目前在好多大城市全是各式各样的家装公司&#xff0c;这篇以上海装修公司为例&#xff0c;向大伙儿详细介绍一下上海装修设计公司的有些收费标准&#xff0c;看一下绝大多数…

colab清理gpu缓存_安卓手机为什么会变卡?强制GPU渲染手机就能变流畅?你真的懂吗...

使用过安卓手机的朋友都知道&#xff0c;安卓手机最大的毛病就是卡顿&#xff0c;那你知道安卓手机变卡的原因吗&#xff1f;还有网上很多教程说开启“强制进行GPU渲染”手机就会变流畅&#xff0c;真的是这样吗&#xff1f;我们先来了解安卓手机为什么会变卡&#xff1a;安卓手…

脉冲宽度调制pdm_STM32第七章-脉冲宽度调制

先说在开头啊&#xff0c;我们学习定时器总感觉它是很难的&#xff0c;这里我就不说他的编程难度&#xff0c;而是对于它的理解难度。学习定时器你就必须了解他的来龙去脉。比如说你现在要使用一个定时器&#xff0c;那么先要决定你要用哪一个定时器&#xff0c;是高级定时器还…

苹果13系统锁屏延迟_iPhone11 锁屏出现延迟,iOS13 新 Bug?

点击 哎咆科技 关注我们这两天很多人在后台反应&#xff0c;用 iPhone11 锁屏的时候出现了延迟的情况。虽然延迟并不是很长&#xff0c;但还是会有“卡顿”的感觉。咆哥&#xff1a;我最近也感觉到了。于是很多同学认为&#xff0c;是不是 iOS13 系统的问题&#xff1f;你们多虑…

ctf 改变图片高度_每天一分钟,python一点通(opencv的图片处理方法)

有网友私信小编说&#xff0c;小编的文章很好&#xff0c;讲解的也很详细&#xff0c;但是有些知识点很深奥&#xff0c;对初学者不是很友好&#xff0c;回想小编的文章虽然几乎每条代码都有介绍&#xff0c;但是很多函数没有太详细&#xff0c;小编后期会重启《每天一分钟&…