架构:Android 组件化开发
前言
強(qiáng)烈推薦先閱讀這篇文章 Android 組件化最佳實(shí)踐
本文是閱讀實(shí)踐后的思考總結(jié),更傾向?qū)嵺`步驟。
組件化開(kāi)發(fā)架構(gòu)
組件化開(kāi)發(fā)大體就是這樣的架構(gòu),最關(guān)鍵的是base 和 base_custom 組件內(nèi)容的區(qū)別化。
這里涉及兩個(gè)概念 模塊化 和 組件化,這兩個(gè)本質(zhì)上是一樣的,都是為了降低代碼耦合性,區(qū)別就在于內(nèi)容,組件化都是單一功能的集合,模塊化就是獨(dú)立業(yè)務(wù)線的集合,其實(shí)我們都可以稱(chēng)之為組件化。
組件化開(kāi)發(fā)步驟
第一步:創(chuàng)建組件
File——>New——>New Moudle——>Phone & Tablet Moudle
創(chuàng)建后是一個(gè)工程,類(lèi)似app,會(huì)默認(rèn)創(chuàng)建好相關(guān)資源文件?!笜I(yè)務(wù)模塊首選」
File——>New——>New Moudle——>Android Library
創(chuàng)建后是一個(gè)moudle「組件首選」
第二步:編碼
編碼過(guò)程中需要注意的就是 資源和代碼的聚合,還是遵循 自己的事情自己做 的原則,降低耦合性。
-
資源
-
圖片資源 drawable,需要用到的放在自己目錄下,類(lèi)似共用的返回鍵這種,放在基礎(chǔ)組件中;
-
顏色值 color,不要共用,沒(méi)多少,寫(xiě)在自己組件中;
-
尺寸 dp,這個(gè)基本沒(méi)啥變化,可以放到基礎(chǔ)組件中;
-
樣式 style,涉及到Activity主題的,這個(gè)可以在基礎(chǔ)組件中定義,組件中繼承,這樣既保證了整個(gè)app風(fēng)格,也可以特殊化。
-
為了保證 組件內(nèi)資源 的 充分隔離,我們可以 規(guī)范命名,以模塊化命名,這樣的外部調(diào)用時(shí),不容易出錯(cuò)。
例如 登錄模塊 ic_login_phone login_phone_hint_text ...
嚴(yán)格一點(diǎn),可以在 build.gradle 文件中配置 命名前綴,這樣編碼時(shí) 不按照這種格式,就會(huì)飄紅。只針對(duì)xml文件,圖片還需自己規(guī)范命名。
android {resourcePrefix "login_"// 其他配置 ... } 復(fù)制代碼
-
-
代碼
- 共用的基類(lèi),工具類(lèi)等放在基礎(chǔ)組件中
- 為了防止外部直接引用 組件內(nèi)的類(lèi),可以在集成到工程中時(shí) 采用runtimeOnly
第三步:調(diào)試配置
代碼寫(xiě)好后,需要 單獨(dú)調(diào)試 或 集成到app中調(diào)試,那就需要配置兩種模式。
- 創(chuàng)建 gradle.properties 文件,定義屬性用來(lái)區(qū)分兩種模式
-
在 build.gradle 文件中配置
- 配置工程類(lèi)型
- 配置 applicationId
- 配置 AndroidManifest.xml
單獨(dú)測(cè)試是需要一個(gè)啟動(dòng)頁(yè)入口的,所以清單文件也需要配置
android{sourceSets {main {if (isSingleRun.toBoolean()) {//單獨(dú)測(cè)試 新建一個(gè)文件夾manifest,存放清單文件,設(shè)置啟動(dòng)頁(yè)入口manifest.srcFile 'src/main/manifest/AndroidManifest.xml'} else {manifest.srcFile 'src/main/AndroidManifest.xml'}}} } 復(fù)制代碼- 配置 Applcation
每個(gè)組件,都會(huì)有需要初始化的東西,共用的(比如:網(wǎng)絡(luò)框架,圖片框架)可以在基礎(chǔ)組件中初始化,那么一些自己模塊需要初始化的東西,該怎么做?因?yàn)榧蓽y(cè)試不會(huì)初始化 組件的Application。
這里我們可以在基礎(chǔ)組件中定義 BaseApp 4. 組件 Application 的動(dòng)態(tài)配置
-
至此,調(diào)試配置完成,配置的目的就是為了方便 組件 獨(dú)立開(kāi)發(fā)時(shí)測(cè)試 以及 集成到app時(shí)測(cè)試。將 gradle.properties 文件中的 isSingleRun 屬性設(shè)置為true,測(cè)試一下配置是否成功。
第四步:調(diào)試測(cè)試
-
將isSingleRun設(shè)置為true ,就可以 單獨(dú)調(diào)試 了,像 app 工程那樣。
-
將isSingleRun設(shè)置為false ,然后集成到app中就可以 集成測(cè)試 了。
集成測(cè)試這里有個(gè)問(wèn)題,如何跳轉(zhuǎn)到組件中的 Activity呢?需要用到 Alibaba 開(kāi)源的 ARouter
推薦閱讀 Android 組件化最佳實(shí)踐 中的 四、組件間界面跳轉(zhuǎn)。
ARouter配置步驟:
base組件中配置build.gradle
android {defaultConfig {...javaCompileOptions {annotationProcessorOptions {arguments = [ moduleName : project.getName() ]}}} }dependencies {api 'com.alibaba:arouter-api:1.3.1'// arouter-compiler 的注解依賴(lài)需要所有使用 ARouter 的 module 都添加依賴(lài)annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 復(fù)制代碼組件中配置
android {defaultConfig {...javaCompileOptions {annotationProcessorOptions {arguments = [ moduleName : project.getName() ]}}} }dependencies {...annotationProcessor 'com.alibaba:arouter-compiler:1.1.4' } 復(fù)制代碼在app主程序 Application中初始化
//這斷必須寫(xiě),否則不生效,本以為我不需要打印日志,沒(méi)寫(xiě)這段,結(jié)果花費(fèi)好長(zhǎng)時(shí)間找bugif (BuildConfig.DEBUG) { // 這兩行必須寫(xiě)在init之前,否則這些配置在init過(guò)程中將無(wú)效ARouter.openLog(); // 打印日志ARouter.openDebug(); // 開(kāi)啟調(diào)試模式(如果在InstantRun模式下運(yùn)行,必須開(kāi)啟調(diào)試模式!線上版本需要關(guān)閉,否則有安全風(fēng)險(xiǎn)) } ARouter.init(this); 復(fù)制代碼組件中被啟動(dòng)Activity 配置 path,path 必須是 ”/“ 開(kāi)頭,最少兩級(jí)
@Route(path = "/test/test") public class TestActivity extends BaseActivity {} 復(fù)制代碼主程序啟動(dòng) 組件中 Activity
ARouter.getInstance().build("/test/test").navigation(); 復(fù)制代碼 -
至此,單獨(dú)調(diào)試 和 簡(jiǎn)單的集成調(diào)試 完結(jié),接下來(lái)更多的就是 集成調(diào)試情況下,如何保證組件在高度聚合的情況下互通有無(wú)。
組件間數(shù)據(jù)傳遞
整體思路就是在基礎(chǔ)組件中定義接口,組件間通過(guò)接口傳遞數(shù)據(jù),完全解耦。
感謝
Android 組件化最佳實(shí)踐
轉(zhuǎn)載于:https://juejin.im/post/5cdd15dc51882515cc7e4ca8
總結(jié)
以上是生活随笔為你收集整理的架构:Android 组件化开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。