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