架構:Android 組件化開發

前言

強烈推薦先閱讀這篇文章 Android 組件化最佳實踐 java

本文是閱讀實踐後的思考總結,更傾向實踐步驟。android

組件化開發架構

組件化開發大致就是這樣的架構,最關鍵的是basebase_custom 組件內容的區別化。git

這裏涉及兩個概念 模塊化 和 組件化,這兩個本質上是同樣的,都是爲了下降代碼耦合性,區別就在於內容,組件化都是單一功能的集合,模塊化就是獨立業務線的集合,其實咱們均可以稱之爲組件化。github

組件化開發步驟

第一步:建立組件

File——>New——>New Moudle——>Phone & Tablet Moudleapi

建立後是一個工程,相似app,會默認建立好相關資源文件。「業務模塊首選」安全

File——>New——>New Moudle——>Android Librarybash

建立後是一個moudle「組件首選」markdown

第二步:編碼

編碼過程當中須要注意的就是 資源和代碼的聚合,仍是遵循 本身的事情本身作 的原則,下降耦合性。網絡

  • 資源架構

    • 圖片資源 drawable,須要用到的放在本身目錄下,相似共用的返回鍵這種,放在基礎組件中;

    • 顏色值 color,不要共用,沒多少,寫在本身組件中;

    • 尺寸 dp,這個基本沒啥變化,能夠放到基礎組件中;

    • 樣式 style,涉及到Activity主題的,這個能夠在基礎組件中定義,組件中繼承,這樣既保證了整個app風格,也能夠特殊化。

    • 爲了保證 組件內資源 的 充分隔離,咱們能夠 規範命名,以模塊化命名,這樣的外部調用時,不容易出錯。

      例如 登陸模塊 ic_login_phone login_phone_hint_text ...

      嚴格一點,能夠在 build.gradle 文件中配置 命名前綴,這樣編碼時 不按照這種格式,就會飄紅。只針對xml文件,圖片還需本身規範命名。

      android {
          resourcePrefix "login_"
          // 其餘配置 ...
      }
      複製代碼
  • 代碼

    • 共用的基類,工具類等放在基礎組件中
    • 爲了防止外部直接引用 組件內的類,能夠在集成到工程中時 採用runtimeOnly
    dependencies {
        ...
        runtimeOnly project(':moudle_shop')
    }
    複製代碼

第三步:調試配置

代碼寫好後,須要 單獨調試 或 集成到app中調試,那就須要配置兩種模式。

  • 建立 gradle.properties 文件,定義屬性用來區分兩種模式
//例如 false表示集成調試,true表示單獨調試
isSingleRun = false
複製代碼
  • build.gradle 文件中配置

    • 配置工程類型
    if (isSingleRun.toBoolean()) {
        //單獨調試 應該是工程類型
        apply plugin: 'com.android.application'
    } else {
        //集成調試 則做爲library集成到app中
        apply plugin: 'com.android.library'
    }
    android{
      ...  
    }
    ...
    
    複製代碼
    • 配置 applicationId
    android{
        defaultConfig {
            //單獨測試 須要配置applicationId
            if (isSingleRun.toBoolean()) {
                applicationId "com.xx.moudle_xx"
            }
        }
    }
    複製代碼
    • 配置 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 組件化最佳實踐 中的 4、組件間界面跳轉

    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中初始化

    //這斷必須寫,不然不生效,本覺得我不須要打印日誌,沒寫這段,結果花費好長時間找bug
     if (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 組件化最佳實踐

相關文章
相關標籤/搜索