應(yīng)用模板代碼地址:https://github.com/thfhongfeng/AndroidAppTemplate
(可直接參考項目根目錄的readme文件)
特點:
- 模塊化開發(fā) ,支持MVC, MVP, MVVM架構(gòu);
- 依賴包統(tǒng)一管理,配置分離;
- 盡量做到第三方API可插拔化,與業(yè)務(wù)代碼分離;
項目目錄結(jié)構(gòu)圖:

- tool模塊為公共模塊,與項目和業(yè)務(wù)無關(guān),主要是一些通用的工具類,控件類及組件。
- config模塊為配置模塊,該模塊與config_xxx.gradle中的配置項相配合, 主要進行項目的配置,比如:項目常量設(shè)置,項目模塊開關(guān)及業(yè)務(wù)功能開關(guān)等。
- router模塊為路由模塊,用于bundle模塊間的通信。
- base模塊為主體基礎(chǔ)模塊,該模塊放置了所有項目和業(yè)務(wù)通用基礎(chǔ)庫(與項目相關(guān),但不與具體業(yè)務(wù)相關(guān))。
- base_lib_immersionbar模塊為沉浸式狀態(tài)欄lib庫,base模塊中用到。
- app_welcome為入口模塊,用于App入口界面的啟動。主要包括loading界面(app初始數(shù)據(jù)的獲?。豪绨姹靖虑闆r等)和welcome界面。
-
app為構(gòu)建模塊,主要用于項目初始化,構(gòu)建和打包,與具體業(yè)務(wù)無關(guān)。
以上為項目必不可少的模塊,為項目的主體模塊。
—————————————————————— - bundle_xxx為常用基礎(chǔ)業(yè)務(wù)模塊,包括:bundle_main, bundle_login, bundle_user
- bundle_business_xxx為"xxx"具體業(yè)務(wù)模塊。
- xxx_lib_yyy為 "xxx"模塊對應(yīng)的lib庫"yyy"。
-
db_server為本地數(shù)據(jù)庫模擬后臺數(shù)據(jù)服務(wù)器模塊(不需要搭架后臺數(shù)據(jù)服務(wù)就可以對模板功能進行調(diào)試驗證),為了調(diào)試和演示。
以上模塊在自己的項目中均可刪除,其中bundle_business_mvc,bundle_business_mvp,bundle_business_mvvm為Demo性質(zhì)的模塊,主要用來引導(dǎo)如何使用這個架構(gòu)模板;db_server則是為了方便調(diào)試和演示;bundle_main,bundle_login,bundle_user根據(jù)自己的需求也可以集成到自己的項目中。
——————————————————————
tool模塊主要包說明:
access-----------------準(zhǔn)入條件封裝,已在基礎(chǔ)ui中封裝使用。
request----------------數(shù)據(jù)請求封裝(http,database)。
permission-----------EasyPermission的進一步封裝,已在基礎(chǔ)ui中封裝使用。
widget-----------------項目無關(guān)的自定義小控件集合(不設(shè)具體界面樣式)。
architecture----------編碼架構(gòu)封裝:mvc,mvp,mvvm(不設(shè)具體界面樣式)。
util----------------------項目無關(guān)的工具集合。
bean、exception---實體類及異常類集合。
base模塊主要包說明:
util----------------------項目相關(guān)而具體業(yè)務(wù)無關(guān)的工具集合,此工具集合與tool模塊的工具的主要區(qū)分依據(jù)是:是否與項目有關(guān)。tool中的工具類要求嚴(yán)格做到與項目無關(guān),是語言與數(shù)據(jù)處理級別的。
widget-----------------項目相關(guān)而具體業(yè)務(wù)無關(guān)的自定義小控件集合(有具體的通用的界面樣式)。
component-----------各種實用組件封裝。
recycler_view--------RecyclerView適配器的封裝。
architecture----------編碼架構(gòu)封裝:mvc,mvp,mvvm(有具體的通用的界面樣式)。
ui-----------------------通用Activity和fragment封裝,默認(rèn)android原生架構(gòu)方式(有具體的通用的界面樣式)。
db----------------------應(yīng)用通用數(shù)據(jù)庫(基于room),用于app的整體數(shù)據(jù)庫操作。
模塊多渠道客制化步驟:
分兩種渠道:common渠道為通用渠道(開發(fā)功能時的默認(rèn)渠道);其它渠道(huawei、小米等)
一、在src下建立不同渠道對應(yīng)的文件夾(如:common、huawei、xiaomi)。
二、修改模塊下的gradle:
a. defaultConfig閉包中添加:
flavorDimensions "default"
b. android閉包中添加:
productFlavors {
common {
}
huawei {
}
xiaomi {
}
}
三、將模塊中渠道有差異化的實現(xiàn)代碼寫在對應(yīng)渠道文件夾中:
a. 差異化的資源文件,直接同名到各個渠道文件夾中(渠道中的同名資源文件會自動覆蓋掉main中的資源文件,從而實現(xiàn)渠道差異化);
b. 差異化的代碼文件則需放在common中進行開發(fā),然后拷貝到各個渠道文件夾中進行差異化開發(fā)(各個渠道文件保持路徑一致)。
渠道化文件夾說明:
main---主體源文件夾。所有渠道共有。
common---默認(rèn)渠道源文件夾,一般是差異化功能的全部默認(rèn)實現(xiàn)。
Xxx---各客制化渠道源文件夾,對應(yīng)不同渠道。為common的拷貝,并在此基礎(chǔ)上進行自己渠道的客制化。
編碼規(guī)范:
- bundle業(yè)務(wù)模塊所有的資源必須以bundle名小寫開頭,例如login模塊的xxx資源必須寫為"login_xxx"。
- bundle業(yè)務(wù)模塊所有的類建議以bundle名首字母大寫開頭,例如login模塊的類Xxx寫為"LoginXxx"。
- 所有bundle間的通信必須要統(tǒng)一使用router模塊進行。為了減少對業(yè)務(wù)模塊的污染,本項目并沒有按arouter的規(guī)范方式進行模塊間通信,而只是借助了其部分功能。
- 編碼時特別是編寫公共類庫時,請確認(rèn)該類庫的共性:
a. 有項目共性,與具體業(yè)務(wù)無關(guān)的統(tǒng)一放在base模塊中。
b. 無項目共性,與業(yè)務(wù)無關(guān)的的統(tǒng)一放在tool模塊中。 - 第三方類庫統(tǒng)一接口化編程,即定義項目要用到的接口,業(yè)務(wù)代碼統(tǒng)一使用接口調(diào)用,具體實現(xiàn)類才與第三方關(guān)聯(lián),做到業(yè)務(wù)代碼與第三方類庫分離。
- 模塊內(nèi)代碼架構(gòu)推薦使用MVVM架構(gòu)。
新建業(yè)務(wù)模塊注意事項:
- 業(yè)務(wù)模塊的Application類統(tǒng)一繼承base模塊的BaseApplication類。
- 業(yè)務(wù)模塊的Constants常量類統(tǒng)一繼承base模塊的BaseConstants類。
- 業(yè)務(wù)模塊的UrlConstants常量類統(tǒng)一繼承base模塊的BaseUrlConstants類。
- 業(yè)務(wù)模塊的SPKeyConstants常量類統(tǒng)一繼承base模塊的BaseSPKeyConstants類。
- 業(yè)務(wù)模塊arouter通信的搭建(結(jié)合arouter的通信方式說明文檔來理解):
a. 模塊中編寫XxxRemote(可參考已有模塊,基本內(nèi)容都差不多)和XxxRemoteService類(通信方法寫在該類中,使用注解方式),用于向外部模塊提供統(tǒng)一的跨模塊服務(wù)。
b. 模塊中編寫XxxClientManager(可參考已有模塊),用于統(tǒng)一調(diào)用外部模塊的跨模塊方法。
c. router模塊中編寫通信命令常量類RouterXxxCommand,添加相關(guān)注釋(可參考已有模塊)。
d. 模塊間通信使用方式:
RouterManager.getInstance(xxxBundleKey).callYyCommand(Context context, final String commandName, final Bundle args, final IRouterCallback callback);
該調(diào)用統(tǒng)一寫在XxxClientManager中