前言
框架重要性不言而喻柑司,一個好的框架可以大大提高后期開發(fā)的效率和質(zhì)量。接下來將分七篇文章講述安卓框架的搭建乓诽,框架中用的是當前比較主流的元素帜羊,也是相對成熟穩(wěn)定的。講述的內(nèi)容參考了很多相關(guān)的資料鸠天,絕大部分也是經(jīng)過一番思考和論證讼育。文章既為分享,也為總結(jié)稠集!
主要涉及的知識點如下(所列內(nèi)容不分先后):
- 1.通信框架: Retrofit2+Okhttp3+Rxjava2
- 2.項目結(jié)構(gòu): MVP
- 3.圖片處理: Picasso
- 4.View的綁定工具: Butterknife
- 5.MaterialDesign風格: CardView奶段、MaterialDailog等
- 6.權(quán)限處理Easypermissions、android N讀寫文件路徑
- 7.涉及到BaseActivity的封裝剥纷,BaseFragment痹籍,MainActivity
- 8.錯誤日志保存編寫
- 9.RecycalView和Adapter的封裝
- 10.常用工具類的封裝
- 11.數(shù)據(jù)庫操作GreenDao的使用
- AgentWebview的使用
部分代碼可能因為比較簡單或者比較基礎(chǔ)并沒有在文章中提及,有興趣的同學可以到源碼中查看晦鞋。好了蹲缠,那么我們就從新建項目開始吧!S贫狻线定!
新建項目并分層
我們代碼里經(jīng)常會建package來分門別類的管理代碼,同樣确买,我們也需要建不同
module來管理我們的框架層斤讥,業(yè)務(wù)層等
1.新建項目
項目名稱為FrameworkDemo,包名為com.example.burro.demo湾趾,第一個Activity的名字命名為LoadingActivity
2.項目分層
在此案例中芭商,我主要把項目分為app入口層派草,主體業(yè)務(wù)層(app主體業(yè)務(wù)層、data主體業(yè)務(wù)層)和項目庫層(app基礎(chǔ)框架層铛楣、data基礎(chǔ)框架層近迁、其他引用庫)。后面講gradle基本配置的時候蛉艾,我還會對資源文件根據(jù)功能模塊進行分層钳踊。分層的好處是顯而易見的,層次分明勿侯、容易維護拓瞪。項目的分層和項目業(yè)務(wù)是分不開的,如果你的項目只有幾個頁面助琐,可能沒必要分的那么細祭埂。如果你的項目頁面、功能模塊較多兵钮,那我建議還是分門別類蛆橡,規(guī)規(guī)矩矩的來。另一個好處是掘譬,如果有新的項目要開發(fā)泰演,那么把這套項目庫層【底層框架】搬過去。只需兩三個小時葱轩,完全可以進行新項目的業(yè)務(wù)開發(fā)工作睦焕。
下面新建庫和文件夾:
- 新建名為
appbiz
的Library, 包名 com.example.burro.appbiz - 新建名為
databiz
的Library,包名com.example.burro.demo.databiz - 新建名為
appframework
的Library,包名com.example.burro.demo.appframework - 新建名為
dataframework
的Library,包名com.example.burro.demo.dataframework - 新建文件夾
bizmodule
- 新建文件夾
libmodule
此時settings.gradle 中內(nèi)容如下
include ':app', ':appbiz', ':databiz', ':appframework', ':dataframework'
把appframework和dataframework移動到libmodule文件夾下,把databiz和appbiz移動到bizmodule文件夾下靴拱,如下
修改settings.gradle里的內(nèi)容在相應的module前加上文件夾名稱 如下
include ':app', 'bizmodule:appbiz', 'bizmodule:databiz', 'libmodule:appframework', 'libmodule:dataframework'
Clean后再編譯項目垃喊。當libmodule、bizmodule文件夾上出現(xiàn)了小杯子袜炕,完成分層本谜!
設(shè)置主題
主題是全局的樣式屬性。
打開app模塊的清單文件偎窘,在application節(jié)點下有個android:theme="@style/AppTheme"乌助,點擊進入AppTheme
可以看到有三個顏色值 colorPrimary,colorPrimaryDark陌知,colorAccent眷茁,如下
這幾個主題屬性顏色與頁面效果關(guān)系可以用一張圖來描述:
修改AppTheme內(nèi)設(shè)置如下
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColorPrimary">@color/textColorPrimary</item>
<item name="android:windowBackground">@color/windowBackground</item>
<item name="android:textColorSecondary">@color/textColorSecondary</item>
</style>
</resources>
需要把顏色改成我們APP對應的值:
<resources>
<!--<color name="colorPrimary">#3F51B5</color>-->
<color name="colorPrimary">#FF306BC5</color>
<color name="colorPrimaryDark">#FF306BC5</color>
<color name="colorAccent">#FF4599DF</color>
<color name="windowBackground">#ffffff</color>
<color name="textColorPrimary">#000000</color>
<color name="textColorSecondary">#f6f6f6</color>
</resources>
這里補充一句,全局view的樣式基本上都可以在這里統(tǒng)一設(shè)置纵诞。例如想要把ScrollView縱向滾動條的顏色修改為紅色,可以這樣設(shè)置
<item name="android:scrollbarThumbVertical">@color/red</item>
【注意:因為這些屬性是全局通用培遵。我把它移動到appfamework工程對應目錄下【原本沒有浙芙,需要新建】
也不要忘了依賴工程登刺,這里依賴關(guān)系如下
dataframework>appframework>appbiz
dataframework>databiz
databiz>appbiz>app
- 在app工程build.gradle內(nèi)的dependencies內(nèi)增加
compile project(':bizmodule:appbiz')
- 在appbiz工程build.gradle內(nèi)的dependencies內(nèi)增加
compile project(':libmodule:appframework')
compile project(':bizmodule:databiz')
- 在databiz工程build.gradle內(nèi)的dependencies內(nèi)增加
compile project(':libmodule:dataframework')
- 在appframework工程build.gradle內(nèi)的dependencies內(nèi)增加
compile project(':libmodule:dataframework')
gradle基本配置
gradle的配置需要全局管理,即絕大部分依賴包或者版本號都將在項目(Project)的build.gradle內(nèi)設(shè)置嗡呼,各工程(Moudle)的build.gradle直接引用纸俭。不得不說gradle著實強大,由于網(wǎng)上有很多gradle的配置教程南窗,講述的也很詳細揍很,這里不再贅述。直接貼代碼
項目(Project)的build.gradle:
原本內(nèi)容不變万伤,在根目錄下新增如下
//外部使用的安卓版本相關(guān)
ext {
minSdkVersion = 15
targetSdkVersion = 25
compileSdkVersion = 25
buildToolsVersion = '25.0.2'
}
//文件內(nèi)部使用
def supportLibraryVersion = '25.1.0'
//compile依賴的第三方庫
ext.deps = [
//android
supportCompat : "com.android.support:support-compat:$supportLibraryVersion",
supportAnnotations : "com.android.support:support-annotations:$supportLibraryVersion",
supportRecyclerView : "com.android.support:recyclerview-v7:$supportLibraryVersion",
supportV4 : "com.android.support:support-v4:$supportLibraryVersion",
supportappcompatV7 : "com.android.support:appcompat-v7:$supportLibraryVersion",
]
工程(Module)的build.gradle:
以libmodule/appframework下的build.gradle為例進行設(shè)置,如原本defaultConfig內(nèi)的compileSdkVersion 25
現(xiàn)在可以設(shè)置成compileSdkVersion rootProject.ext.compileSdkVersion
原本dependencies內(nèi)的compile 'com.android.support:appcompat-v7:25.3.1'
現(xiàn)在可以設(shè)置成compile deps.supportappcompatV7
整體下:
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile deps.supportappcompatV7
}
其他各個工程module也類似設(shè)置窒悔。后續(xù)會依賴很多第三方優(yōu)秀庫,依賴的方式和appcompat-v7一樣