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.pswp.cn/news/529933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529933.shtml
英文地址,請注明出處:http://en.pswp.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怎么播放下一首,javascript – HTML5音頻播放列表 – 第一個結束后如何播放第二個音頻文件?...

這是一個JSLinted,不引人注目的Javascript示例,演示如何處理和使用結束的mediaevent.在您的特定情況下,您將觸發在您的結束事件處理程序中播放第二個音頻文件.單擊播放列表中的項目開始播放.一個音頻結束后,下一個音頻開始.標記&#xff1a;(注意,有意避免< li>元素之間的…

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

這篇教程向悠悠之家的朋友們介紹用MAYA打造排球模型的過程&#xff0c;制作很簡單&#xff0c;希望對剛學習MAYA建模的朋友們有所幫助&#xff0c;我們先看看最終的效果圖&#xff1a;你們一定學過很多創建一個球的技巧&#xff0c;但在這個入門教學里面&#xff0c;我們將要學…

北大計算機系統結構學碩,轉自包云剛,希望的原野?最近幾個月參加了計算所、北大、上海交大多位計算機系統結構碩士與博士的答辯,說幾點體會:?①?高水平國際論文越來越多。簡單...?-?雪球...

來源&#xff1a;雪球App&#xff0c;作者&#xff1a; 逍遙劍99&#xff0c;(https://xueqiu.com/1732900127/153778925)最近幾個月參加了計算所、北大、上海交大多位計算機系統結構碩士與博士的答辯&#xff0c;說幾點體會&#xff1a;① 高水平國際論文越來越多。簡單統計了…

計算機主機箱前后都有什么,目前四種熱門的主機機箱設計都有哪些優缺點?

在DIY里面機箱算是最沒技術含量的產品之一&#xff0c;不過它卻是與DIYer接觸時間最長的東西。氣味大師每天都會按下機箱開機鍵&#xff0c;也會空余時間瞄上幾眼。機箱確實是對DIY影響最大的產品之一&#xff0c;今天我來盤點一下2018年見過的幾個主流機箱設計方案。說是機箱設…

微型計算機硬盤接口主要分為,北京交通大學微機原理與接口技術_期末復習題_圖文...

北京交通大學微機原理與接口技術_期末復習題_圖文更新時間&#xff1a;2017/1/26 18:34:00 瀏覽量&#xff1a;1285 手機版“微機原理與接口技術”2008年期末考試復習題1. 微機系統的硬件由哪幾部分組成&#xff1f;答&#xff1a;三部分&#xff1a;微型計算機(微處理器&…

計算機自然語言的中國科學家,中科院教授王斌加入小米 任自然語言處理首席科學家...

王斌新浪科技訊 8月28日上午消息&#xff0c;小米新經濟研究中心發布微信文章稱&#xff0c;中國科學院信息工程研究所研究員、博士生導師王斌已于8月20日正式加入小米集團&#xff0c;任AI實驗室自然語言處理(Natural Language Processing&#xff0c;NLP)首席科學家&#xff…

springcloud 相同服務名_淺談分布式與微服務

分布式和微服務是什么關系&#xff1f;簡單來說&#xff0c;分布式和微服務的概念比較相似&#xff0c;分布式屬于微服務。但是分布式和微服務在架構、作用和粒度上有所區別。因此&#xff0c;兩者的關系是既相互聯系又相互區別。本文主要帶大家認識分布式和微服務&#xff0c;…

html div 子元素 過多 卡頓,CSS不定高元素transition動畫的解決方案

CSS不定高元素transition動畫的解決方案類別&#xff1a; 技術CSS時間&#xff1a;2019-07-27 23:41:35字數&#xff1a;3297版權所有&#xff0c;未經允許&#xff0c;請勿轉載&#xff0c;謝謝合作~### 前言CSS中transition可以方便的實現我們的過渡動畫效果&#xff0c;但并…

bat 變量 文件內容第一行_VBA基礎入門(38)FSO生成bat文件后執行的實例

1.首先&#xff0c;我們回顧下FSO是什么&#xff1f;文件系統對象FSO的英文全稱是File System Object &#xff0c;這種對象模型提出了有別于傳統的文件操作語句處理文件和文件夾的方法。通過采用object.method這種在面向對象編程中廣泛使用的語法&#xff0c;將一系列操作文件…

HTML5廢除元素,HTML5 與 HTML4 的區別(2) - 新增的元素和廢除的元素

新增的結構元素在 HTML5 中&#xff0c;新增了以下與結構相關的元素&#xff1a;section元素section 元素表示頁面中的一個內容區塊&#xff0c;比如章節、頁眉、頁腳或頁面中的其他部分。它可以與h1、h2、h3、h4、h5、h6等元素結合起來使用&#xff0c;標識文檔結構。HTML5 中…

ps怎么更改背景圖層大小_PhotoShop處理圖層的一些技巧方法、PS圖層處理教程

一、了解圖層以及為什么它們如此有用。1.在“圖層”面板中查看和選擇圖層2.層包含組成分層文件的圖像&#xff0c;文本或對象。它們使您可以在一層上移動&#xff0c;編輯和使用內容&#xff0c;而不會影響其他層上的內容。3.圖層在“ 圖層”面板中按堆棧排列&#xff0c;該面板…

zabbix計算型監控項函數last_zabbix 自定義key類型之計算(Calculated items)-阿里云開發者社區...

計算類型的key定義主要是根據已定義過的key值來計算的。例如創建一個計算linux服務器內存實際使用大小的監控項(計算方法為&#xff1a;vm.memory.size[total]-vm.memory.size[cached]-vm.memory.size[free])&#xff0c;方法如下&#xff1a;1、在模板中或是主機中選擇監控項-…

使用計算機畫畫需要什么軟件,專業電腦繪畫用的是什么工具?

滿意答案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…