最近利用業餘時間,開發了一款基於懂球帝接口數據的足球資訊app,整體的UI也是仿照懂球帝設計的。這是一個比較綜合的項目,用到了不少以前沒用過的組件和api,而且產生了很多新的開發思路,有些實現方式也是自己琢磨的,所以值得做一些記錄,可能還存在瑕疵和可以優化的地方,也希望大家給我多指正。
一、組件化模塊
項目主要採用的是模塊組件化的架構。
組件化或者說模塊化實現業務分離一直是項目研發與管理的大勢所趨,所以本項目雖然是由我個人開發的,但是也採取了組件化的方式,一是方便項目管理,二是作爲對組件化的學習。
箭頭所指爲引用庫
App殼工程:沒有實際開發業務,主要負責程序的打包,gradle配置等工作;
module_main:主要負責引導頁、主頁面,作爲程序的主入口;
module_news/module_match/module_circle/module_rank:根據不同業務需求,獨立成不同的組件;
lib_common:所有公用的組件庫、所需權限、全局通用的Application等;
項目的目錄結構:
實施流程
思路:
在實際的開發過程中,開發人員根據任務劃分,構建自己的業務組件。開發時將自己的組件切換爲application進行開發、調試等工作,我們這裏稱之爲組件工程模式;開發完成後,將各個業務組件切換爲library,調試、運行app,我們這裏稱之爲組件集成模式;
具體實現:
1、組件工程模式和集成模式的切換
通過在build.gradle中設置 apply plugin: 'com.android.application'和apply plugin: 'com.android.library',可以實現將組件作爲主工程或者庫來使用;爲了方便切換,我們可以在gradle.properties中添加相應的標誌位,通過標誌位進行切換:
moduleNewsAsMain=false
if(moduleNewsAsMain.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
如果將moduleNewsAsMain設置爲true,就將module_news這個業務組件作爲主工程來運行;反之,則作爲庫供引用者調用;
2、AndroidManifest切換
當開發者開發、調試某個組件時,一定會設置組件內的LauncherActivity和Application;當切換回集成模式之後,每個組件都存在自己獨立的manifest文件設置和Application,衆所周知,一個項目只允許有一個manifest文件和Application,爲了解決這個衝突,我們需要在組件工程中設置兩個不同的manifest文件位置。根據不同模式切換manifest;
在build.gradle設置:
sourceSets {
main {
if (moduleNewsAsMain.toBoolean()) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
//集成開發模式下排除debug文件夾中的所有Java文件
java{
exclude 'debug/**'
}
}
}
}
3、第三方庫管理
每個模塊在開發過程中都會需要引入第三方庫,爲了避免引入重複的庫,我們需要將第三方庫進行統一管理。
在項目的根目錄下新建一個gradle類型的文件,可以命名爲versions.gradle:
ext {
android = [
compileSdkVersion: 28
]
dependencies = [
'recyclerview': 'androidx.recyclerview:recyclerview:1.0.0'
]
}
在組件的build.gradle中引用相應的庫:
implementation rootProject.ext.dependencies["recyclerview"]
二、路由設置
項目基本搭建完成了,還要考慮一個問題,在開發過程中,有可能遇到模塊間的Activity需要相互跳轉的情況,我們可以採用組件庫引用的方式來實現,不過這樣會存在第三方庫重複引用的問題,最重要的一點是,我們使用模塊化這種思路不就是希望模塊之間儘可能的獨立嗎?這種方式顯然沒有意義。因此,我們這裏需要引入路由了。
本項目使用的是阿里的路由框架——Arouter,這裏就不介紹Arouter有什麼優點了,直接單刀直入,介紹一下如何在項目中使用它。
1、配置Arouter:
1.1、首先在versions.gradle中引入Arouter庫:
'arouter': 'com.alibaba:arouter-api:1.4.0'
1.2、在lib_common的build.gradle下聲明該庫:
api rootProject.ext.dependencies["arouter"]
1.3、在Project下的build.gradle—>buildscript—>dependencies下添加:
classpath "com.alibaba:arouter-register:1.0.2"
1.4、在每一個業務組件的build.gradle中添加annotationProcessor:
annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
1.5、在Application中初始化Arouter:
ARouter.init(mApplication);
至此,Arouter的配置工作就完成了;
2、使用Arouter實現界面跳轉(假定由A界面跳轉到B界面)
2.1、設置路由:在B界面中添加Route(path="/xx/xx")註解,聲明路由的路徑;
2.2、跳轉:在A界面中添加ARouter.getInstance().build("/xx/xx").navigation();
2.3、帶參數跳轉:在A界面中添加ARouter.getInstance().build("/xx/xx").withString("key", value).navigation();
ARouter.getInstance().build("/xx/xx").withSerializable("key", value).navigation();
同時,在B界面中也需要對接收的參數進行註解,並且在onCreate()中inject Arouter
三、總結
本篇文章主要總結了自己是如何一步步構建組件化項目的。相比於單一工程的項目,組件化項目可以進一步的降低程序的耦合度;提高了單組件下程序調試、編譯的速度;以組件爲單位劃分業務模塊,使得代碼結構更加清晰,方便項目後期的迭代與維護;上述的這種組件化結構只是我個人通過網絡、實踐摸索出的,可能還存在一些問題,希望大家看完之後能多多提出寶貴意見~