一、架构模式-MVP
当前项目采用的是MVP(Model-View-Presenter)
架构模式,改善了原版本简易MVP
的架构方式(原MVP
架构其实是VP
架构——Presenter
层承担了Model
的工作)。
二、Project-模块化
为了各个功能模块之间解耦、便于团队协作开发及后期维护,本次新版将原有的双Module
架构升级为更加细致的多Module
架构,各Module
命名及释义如下:
- app
App
入口,一般只包含Application、SplashActivity
和MainActivity
。 - base
标准基础库,新项目可以直接使用进行开发,不涉及项目中的相关业务,一般只包含能够在各个项目中直接通用的基础类。
如:相关的Base
类、基础的Log
类等。 - common
公共资源库,base
库的补充。部分工具类、UI组件等根据项目需求抽取集成,但不会涉及到具体的业务逻辑。
如:公用的Util
类、自定义的各种控件、常量类等。 - component-xxx
部件/成分库(也叫Project
组成部分),提供基础的功能实现,但不涉及具体的业务。
如:网络请求(component-net
)、视频播放(component-video
)等等。 - module-xxx
业务功能库,提供完整的业务功能实现及对应的UI效果展示。
如:我的(module-mine
)、推拿(module-mass
)等。
三、屏幕(分辨率适配)
依据实际的UI
设计图,我们以sw-375dp
为基准进行屏幕的适配工作,相应适配文件存放于base->res/values、values-swxxxdp/measure.xml
内。
在实际开发中根据UI设计图尺寸直接设置对应控件的尺寸即可(@dimen/common_measure_xxxdp
),具体使用示例如下:
// 在需要使用地方添加对应的尺寸
android:layout_height="@dimen/common_measure_xxxdp"
四、项目中三方库使用规范及示例
- Java 8
项目原则上是基于Java 8
,我们使用到的部分库(ButterKnife、Retrofit、ARouter
等)中也使用了Java 8
的特性(比较常见的是Lambda
表达式),为了确保能够正常的编译使用,我们必须在对应Module/build.gradle
文件中手动添加Java 8
支持,具体如下:android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ... }
- ButterKnife
- 概述
一个专注于Android
系统的View
依赖注入框架,省去了findViewById、setOnClickListener
等重复代码,简化代码、提高开发效率。 - 使用规范
这里我们使用的是ButterKnife-10.2.3
版本,区别于app
中使用的R.id.xxx
映射方式,在Module/Library
中需要通过R2.id.xxx
去映射对应的控件。 - 示例
@BindView(R2.id.mine_iv_icon) RoundImageView mIvIcon;
- 注意事项
在使用该库的每个类的build.gradle文件中要添加如下配置:apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.butterknife' dependencies { ... annotationProcessor rootProject.ext.dependencies['butterknife-compiler'] ... }
- 概述
- ARouter
- 概述
一款阿里开源的路由框架,是一个帮助Android进行模块化、组件化开发的开源库。它支持模块间的路由、通信、解耦。 - 使用规范
在开发过程中,当我们对要进行跳转的页面上添加支持路由的注解时,我们需要遵循以下规则:
路径需要注意的是至少需要有两级,/xx/xx,我们以/moduleName/className为基准进行对应的命名。 - 使用示例
@Route(path = "/mine/mineActivity") public class MineActivity{ ... } ```
- 注意事项
在使用该库的每个类的build.gradle文件中要添加如下配置:android { ... defaultConfig { ... // ARouter--每个使用到路由的Module必须加 javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } ... } ... } dependencies { // ARouter--每个使用到路由的Module必须加 annotationProcessor rootProject.ext.dependencies['arouter-compiler'] }
- 概述
五、数据存储
- SQLite
一个轻量级的数据库。数据库操作Helper
类,放置在common
中,相关的常量Key
类也可以放置在common
,其它具体的表操作由各个Module
自行维护。 - SharedPreferences
一个轻量级的存储类,解决在开发过程中我们需要保存一些简单的、轻量的数据。如:用户设置、一些开关/判断的标记等,这些需要保存的数据往往可能只是一两个字符,这种数据我们使用SharedPreferences
保存即可。
放置在common
中,相关的常量Key
类也可以放置在common
. - Native Files
当我们在开发过程涉及到一些需要缓存的文件时,很多应用采取的策略是到SD
卡的根目录上创建自己的文件夹然后保存到对应的文件路径下(之前的泰邦设计也是这样做的),虽然达到了缓存文件的目的,但它并不被Android
所推荐——当应用卸载后,这些被创建的文件夹仍然存在,造成手机内多出了不少的垃圾文件,这样是极不友好的。
Android
建议我们在缓存文件时使用应用专属(这里又分内部存储与外部存储,建议是尽可能使用外部存储进行缓存)的缓存路径进行文件的缓存,当应用被卸载后,这些数据也会随之而消失,从而规避了上述问题。
关于应用专属内、外部存储的更多了解,建议阅读以下文章或自行了解后再进行相关的操作:
彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑
Android文件缓存目录
重点关注:getExternalCacheDir、getExternalFilesDir
。
六、Other
未完待续...