前言
框架重要性不言而喻,一个好的框架可以大大提高后期开发的效率和质量。接下来将分七篇文章讲述安卓框架的搭建,框架中用的是当前比较主流的元素,也是相对成熟稳定的。讲述的内容参考了很多相关的资料,绝大部分也是经过一番思考和论证。文章既为分享,也为总结!
主要涉及的知识点如下(所列内容不分先后):
- 1.通信框架: Retrofit2+Okhttp3+Rxjava2
- 2.项目结构: MVP
- 3.图片处理: Picasso
- 4.View的绑定工具: Butterknife
- 5.MaterialDesign风格: CardView、MaterialDailog等
- 6.权限处理Easypermissions、android N读写文件路径
- 7.涉及到BaseActivity的封装,BaseFragment,MainActivity
- 8.错误日志保存编写
- 9.RecycalView和Adapter的封装
- 10.常用工具类的封装
- 11.数据库操作GreenDao的使用
- AgentWebview的使用
部分代码可能因为比较简单或者比较基础并没有在文章中提及,有兴趣的同学可以到源码中查看。好了,那么我们就从新建项目开始吧!!!
新建项目并分层
我们代码里经常会建package来分门别类的管理代码,同样,我们也需要建不同
module来管理我们的框架层,业务层等
1.新建项目
项目名称为FrameworkDemo,包名为com.example.burro.demo,第一个Activity的名字命名为LoadingActivity
2.项目分层
在此案例中,我主要把项目分为app入口层,主体业务层(app主体业务层、data主体业务层)和项目库层(app基础框架层、data基础框架层、其他引用库)。后面讲gradle基本配置的时候,我还会对资源文件根据功能模块进行分层。分层的好处是显而易见的,层次分明、容易维护。项目的分层和项目业务是分不开的,如果你的项目只有几个页面,可能没必要分的那么细。如果你的项目页面、功能模块较多,那我建议还是分门别类,规规矩矩的来。另一个好处是,如果有新的项目要开发,那么把这套项目库层【底层框架】搬过去。只需两三个小时,完全可以进行新项目的业务开发工作。
下面新建库和文件夹:
- 新建名为
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 中内容如下
include ':app', ':appbiz', ':databiz', ':appframework', ':dataframework'
把appframework和dataframework移动到libmodule文件夹下,把databiz和appbiz移动到bizmodule文件夹下,如下
修改settings.gradle里的内容在相应的module前加上文件夹名称 如下
include ':app', 'bizmodule:appbiz', 'bizmodule:databiz', 'libmodule:appframework', 'libmodule:dataframework'
Clean后再编译项目。当libmodule、bizmodule文件夹上出现了小杯子,完成分层!
设置主题
主题是全局的样式属性。
打开app模块的清单文件,在application节点下有个android:theme="@style/AppTheme",点击进入AppTheme
可以看到有三个颜色值 colorPrimary,colorPrimaryDark,colorAccent,如下
这几个主题属性颜色与页面效果关系可以用一张图来描述:
修改AppTheme内设置如下
<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的样式基本上都可以在这里统一设置。例如想要把ScrollView纵向滚动条的颜色修改为红色,可以这样设置
<item name="android:scrollbarThumbVertical">@color/red</item>
【注意:因为这些属性是全局通用。我把它移动到appfamework工程对应目录下【原本没有,需要新建】
也不要忘了依赖工程,这里依赖关系如下
dataframework>appframework>appbiz
dataframework>databiz
databiz>appbiz>app
- 在app工程build.gradle内的dependencies内增加
compile project(':bizmodule:appbiz')
- 在appbiz工程build.gradle内的dependencies内增加
compile project(':libmodule:appframework')
compile project(':bizmodule:databiz')
- 在databiz工程build.gradle内的dependencies内增加
compile project(':libmodule:dataframework')
- 在appframework工程build.gradle内的dependencies内增加
compile project(':libmodule:dataframework')
gradle基本配置
gradle的配置需要全局管理,即绝大部分依赖包或者版本号都将在项目(Project)的build.gradle内设置,各工程(Moudle)的build.gradle直接引用。不得不说gradle着实强大,由于网上有很多gradle的配置教程,讲述的也很详细,这里不再赘述。直接贴代码
项目(Project)的build.gradle:
原本内容不变,在根目录下新增如下
//外部使用的安卓版本相关
ext {
minSdkVersion = 15
targetSdkVersion = 25
compileSdkVersion = 25
buildToolsVersion = '25.0.2'
}
//文件内部使用
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为例进行设置,如原本defaultConfig内的compileSdkVersion 25
现在可以设置成compileSdkVersion rootProject.ext.compileSdkVersion
原本dependencies内的compile 'com.android.support:appcompat-v7:25.3.1'
现在可以设置成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也类似设置。后续会依赖很多第三方优秀库,依赖的方式和appcompat-v7一样