一篇文章搞懂 Android 元件化
熱文導讀 | 點選標題閱讀
一款基於Kotlin+MVP+元件化的麻雀App(文末有彩蛋)
轉自:zhshq
www.jianshu.com/p/8b6e6a50e21e
網上元件化的文章很多,我本人學習組建化的過程也借鑑了網上先輩們的文章。但大多數文章都從底層的細枝末節開始講述,由下而上給人一種這門技術“博大精深”望而生畏的感覺。而我寫這篇文章的初衷就是由上而下,希望別人在閱讀的過程中能夠覺得“元件化原來也就是這幾個東西”的感覺。
1、首先我們來看一下元件化專案和傳統專案的區別
在傳統的專案裡
我們通常情況下會有一個commonLib的Libary模組和一個app的application模組,業務中的邏輯都寫在app中各個功能模組放到不同的包下。這樣做有以下幾個主要的缺點:
1、無論分包做的再好,隨著專案的增大,專案會逐漸失去層次感,別人來接手的時候會很吃力。
2、我們在debug一個小功能的時候每次修改程式碼都需要重新build整個專案,這樣顯的很不合理(不知道AS的熱部署有沒有解決這個問題)
3、多人聯合開發在版本管理中很容易出現衝突和程式碼覆蓋的問題
在元件化專案中
除了有commonLib和app模組外,我們按照功能劃分各個業務元件模組(eg:微信可以劃分出chat,contract,find,mine四個大模組),之前的包變成現在的模組,增加了層次感;每個功能模組可以單獨編譯,加快了編譯速度,也為提供單元模組測試提供了支援;多人開發只負責自己的模組,直接避免了版本管理的衝突。
圖1-0元件化基本專案結構圖
在明白了元件化為我們解決的主要問題後我們來看看需要怎麼做
初步實現組建化其實我們最終要解決的問題就只有2個:
1、設定模組之間的依賴,且使得業務模組可單獨編譯--通過配置gradle即可解決
2、業務模組之間的頁面跳轉以及通訊--使用阿里開源的ARouter即可解決
接下來我們具體來看一下如何操作
首先來看一下模組間依賴的問題
我們可以參照微信的四個模組(chat,contract,find,mine)來配置
首先我們專案基本結構如下:
圖1-1專案結構
我們一共需要建6個module,除了4個功能模組外還有一個基本的common庫和一個作為啟動的application。
在建好專案後我們需要給4個module配置一個是否單獨編譯的開關:
圖1-2單獨編譯各個模組的開關
關於開關的配置位置這是一個問題,我們把它新增在gradle.properties檔案中,這樣我們每次修改值的時候就可以觸發gradle的重新構建,便於我們單獨編譯module。
我們單獨編譯的開關配置好了,現在我們來配置6個module之間的依賴關係:
圖1-3app和功能lib的基礎依賴
首先,為了方便各個module之間的互動我們借用了阿里的充分ARouter庫,所以在每個非common的庫(包括主Application)中我都強烈建議加入對ARouter和commonlib的依賴。
其次,4個功能模組庫我們要為它裝上我們之前配置的是否單獨編譯的開關,我們需要修改如下2個地方:
圖1-4功能模組配置單獨編譯開關
可以看到我們要修改的就是我紅框框住的地方,當我們的開關開啟的時候,我們就把他當成一個單獨的application來編譯,並且賦予它一個獨一無二的applicationId,這樣我們就可以通過剛剛在gradle.properties中配置的開關來控制它是否單獨作為一個application來編譯。
而對於我們的入口module--app模組我們則需要做如下的配置:
圖1-5主module的gradle配置
我們除了需要配置基本的ARouter以及commonlib依賴以外還需要在app模組的gradle檔案中根據開關選擇是否需要依賴我們的功能模組,這個和各個功能模組中的配置是相呼應的。
而對於其他元件模組,重複上述步驟即可完成元件化框架的搭建:
圖1-6專案結構圖
2、在完成了元件化框架的搭建後我們來簡單的看看框架中一些具有特色的使用方法。
我們首先來看一下各個模組的頁面間是怎樣跳轉的。
我們之前已經依賴了ARouter(詳細用法參照https://github.com/alibaba/ARouter),我們要用它來幫我們實現跳轉需要以下幾步:
圖2-1
跳轉的方法就如同圖2-1中顯示,我們需要標明目標頁面,附帶上要傳送的引數,然後呼叫navigation()就可以跳轉了,不過有人問目標頁面怎麼看著就是一個路徑,它是怎樣定義的?
圖2-2目標頁面的配置
首先要用@Route註解標註頁面,並在path變數中給頁面定義一個路徑
對於傳送過來的變數我們直接定義一個同名的欄位用@Autowired變數標註,Arouter會對該欄位自動賦值
最後我們還需要將該頁面注入到ARouter中(原理類似ButterKnife),讓他幫我們完成我們需要的工作
這樣,我們就完成了頁面間的跳轉了,是不是比起我們傳統的方法更加簡單合理?
3. 最後我們來看一下元件間如何為彼此提供服務。
這裡我想在主module中呼叫home元件的sayHello方法來Toast一個人的名字
那home裡的方法怎樣才能被其他模組(包括主模組和其他元件模組)呼叫
圖3-1公共介面的定義
首先在commonlib模組裡建立一個暴露方法的介面,並定義介面簽名,同時繼承 Iprovider 介面
然後在home模組中繼承commonlib裡定義的介面,並實現簽名方法。
圖3-2在提供方法的module中的配置
這裡我們同樣使用Arouter的 @Router註解來提供這次服務的路由。
最後,我們在其他模組使用 @Autowired 註解就可以呼叫該方法了
圖3-3對於方法的呼叫
可以看到我們同樣使用了@Autowired註解來初始定baseService服務,並將頁面注入Arouter中即可呼叫服務中的方法,且對於服務的依賴是基於介面的依賴,大大提高了其靈活性!
基本元件化框架的搭建就初步完成了,希望認真看完的朋友能有所收穫!如有不正之處還望指正!
以上專案的碼雲地(歡迎參與改進):
https://gitee.com/zsq519/ARouterBaseProject
想進阿里嗎?快加入我們的知識星球吧,如下:
如有收穫,歡迎「分享 」
「點贊」「評論 」
媽媽常教導我,讓我養成良好習慣。這樣長大才能成為一個有用的人。良好的習慣是尊敬師長這樣長大才能成為一個有用的人。良好的習慣是尊敬師長,愛護同學,對人有禮貌;是不粗心,做事情不拖拉;還是愛護公物,不浪費糧食。為什麼呢?因為擁有良好習慣,做一個品德高尚的人,懂得尊重別人,才會得到別人的尊重。我要努力地做到這些。我有一些壞習慣,有時候學習很粗心,把一些會做的題做錯。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃飯很慢,有的時候還剩飯。我還起床磨蹭,本來應該迅速地穿好衣服,但是,我總是磨磨蹭蹭地,速度很慢。“我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!” 在上幼兒園以前,我什麼也不會幹,就連穿衣服也是媽媽給我穿好,就要上幼兒園了,這樣可不行,媽媽鍛鍊我要學會自己穿衣服。 有一天,媽媽把衣服擺在我面前,開始讓我自己穿。一開始。我又哭又叫就是不穿,還把衣服扔的滿地都是,然後坐在地上開始大哭,等了好長時間,媽媽還是不理我,我只好自己乖乖的把衣服穿好, 一出了房間門,媽媽就笑了起來,再看看我的衣服,毛衣和褲子都穿反了,我趕緊回房間又重新穿了一遍,這次穿好了,拿起外套,可是外套的扣子又扣不上了,釦子可調皮了,好像故意和我作對,我把釦子往釦眼——人類邪惡的根源;愛情——幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話:幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話“親愛的!擦乾你的眼淚,至高無上的愛情已經開啟了我們的眼界,使我們成了它的崇拜者。是它,
媽媽常教導我,讓我養成良好習慣。這樣長大才能成為一個有用的人。良好的習慣是尊敬師長這樣長大才能成為一個有用的人。良好的習慣是尊敬師長,愛護同學,對人有禮貌;是不粗心,做事情不拖拉;還是愛護公物,不浪費糧食。為什麼呢?因為擁有良好習慣,做一個品德高尚的人,懂得尊重別人,才會得到別人的尊重。我要努力地做到這些。我有一些壞習慣,有時候學習很粗心,把一些會做的題做錯。在生活上,也很粗心,有一次早上起床居然穿反了衣服。我吃飯很慢,有的時候還剩飯。我還起床磨蹭,本來應該迅速地穿好衣服,但是,我總是磨磨蹭蹭地,速度很慢。“我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!我打算在這學期裡,改掉這些壞習慣。早上起來,迅速地穿好衣服,不拖拉。學習不粗心,仔細完成每一道題。吃飯的時候,要很快的把飯吃完,不剩飯。我要從一點一滴做起,逐漸養成良好習慣。我相信自己一定能成為一名品學兼優的好學生!” 在上幼兒園以前,我什麼也不會幹,就連穿衣服也是媽媽給我穿好,就要上幼兒園了,這樣可不行,媽媽鍛鍊我要學會自己穿衣服。 有一天,媽媽把衣服擺在我面前,開始讓我自己穿。一開始。我又哭又叫就是不穿,還把衣服扔的滿地都是,然後坐在地上開始大哭,等了好長時間,媽媽還是不理我,我只好自己乖乖的把衣服穿好, 一出了房間門,媽媽就笑了起來,再看看我的衣服,毛衣和褲子都穿反了,我趕緊回房間又重新穿了一遍,這次穿好了,拿起外套,可是外套的扣子又扣不上了,釦子可調皮了,好像故意和我作對,我把釦子往釦眼——人類邪惡的根源;愛情——幸福和光明的源泉。我一直在這些思想的舞臺上徘徊。突然我發現兩個身影從我面前經過,坐在不遠的草地上。這是一對從農田那邊走過來的青年男女。農田那邊有農民的茅舍。在一陣令人傷心的沉默之後,隨著一聲長嘆,我聽見從一個肺癆病人的嘴裡說出了這樣的話:“親愛的!擦乾你的眼淚,至高無上的愛情已經開啟了我們的眼界,使我們成了它的崇拜者。是它,
如你有好的文章想和大家分享歡迎投稿,直接向我投遞文章連結即可
最後,國慶福利來了,我們的知識星球已達到1000人了,之前說過到達1000人時將大大幅漲價到169元,為了反饋大家對我們的關注和厚愛,特此維持現價99元最後一天,今天后(今晚 00:00)後將漲到169元,歡迎大家加入我們的知識星球,更多星球資訊參見:
微信掃描或者點選上方二維碼領取Android\Python\AI\Java等高階進階資源
更多學習資料點選下面的“閱讀原文”獲取
相關文章
- 一篇文章搞懂Android 自定義viewgroup的難點AndroidView
- 一篇文章搞懂android儲存目錄結構Android
- 一篇文章搞懂filebeat(ELK)
- 一篇文章搞懂 Activity 啟動模式模式
- 快速上手Ajax【一篇文章就搞懂】
- 一篇文章快速搞懂什麼是GitHubGithub
- 一篇文章快速搞懂 Apache SkyWalking 的 OALApache
- 一篇文章讓你搞懂原型和原型鏈原型
- 一篇文章搞懂JavaScript正規表示式之方法JavaScript
- 一篇文章快速搞懂Qt檔案讀寫操作QT
- 一篇文章帶你徹底搞懂join的用法
- 一篇文章帶你搞懂 etcd 3.5 的核心特性
- 一篇文章搞懂熱修復類載入方案原理
- 五分鐘學Java:一篇文章搞懂spring和springMVCJavaSpringMVC
- InfluxDB從原理到實戰 - 一篇文章搞懂InfluxDB時區UX
- Android元件化專題 - 元件化配置Android元件化
- [Android元件化]Android app BundleAndroid元件化APP
- Android 元件化之路Android元件化
- 五分鐘學Java:一篇文章帶你搞懂spring全家桶套餐JavaSpring
- 一篇文章搞定 MySQL 索引優化MySql索引優化
- Java多執行緒詳解——一篇文章搞懂Java多執行緒Java執行緒
- Android元件化框架搭建Android元件化框架
- Android元件化:stitch框架Android元件化框架
- Android元件化實現Android元件化
- [Android]元件化的Kotlin適配–迄今最強的Kotlin踩坑文章(5.24更新)Android元件化Kotlin
- 一篇搞懂 PHP 的引用PHP
- 一篇搞懂 PHP 的常量PHP
- [Android元件化]- SPI載入Android元件化
- Android 元件化最佳實踐Android元件化
- Android元件化注意事項Android元件化
- Android 元件化架構概要Android元件化架構
- 漫談Android元件化及Web化Android元件化Web
- 乾貨預警,一篇文章帶你徹底搞懂 Laravel 框架的執行原理!!!Laravel框架
- Android元件化之(路由 vs 元件匯流排)Android元件化路由
- 一篇文章帶你瞭解介面自動化
- [Android元件化]AAB外掛化架構Android元件化架構
- [Android]Gank 元件化例項AppAndroid元件化APP
- Android MVVM元件化架構方案AndroidMVVM元件化架構