1.项目结构
现在的MVP模式越来越流行。就默认采用了。如果项目比较小的话:
app——Application Activity Fragment Presenter等的顶级父类
config——API,常量表等
model——数据层
—— entities——数据模型presenter——MVP的P
service——服务
ui——MVP的V
utils——工具类集合
widget——各个可复用View集合
如果项目比较大,上面的方式一定会造成presenter和view里近百个文件。看瞎眼系列。推荐下列方式:
app
config
model
—— entitiesmodule——将界面层以功能模块分配包。
—— launch
—— main
—— account
—— news
—— music
……utils
widget
2.配置主题
对于不遵守Material Design的项目无视这一步。
1.先在color.xml中写好需要的颜色:
<resources>
<color name="Orange">#ff5722</color>
<color name="DeepPurple">#673AB7</color>
<color name="DeepPurple900">#311B92</color>
<color name="White">#fff</color>
<color name="Gray">#888888</color>
<color name="Gray100">#dddddd</color>
<color name="Gray600">#999999</color>
</resources>
注意color.xml是配色表。应该是描述颜色而不是对字体颜色,背景颜色等的定义。这样能防止相近的颜色重复定义。而导致界面颜色不统一。
2.在style.xml里定义主题:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/DeepPurple</item>
<item name="colorPrimaryDark">@color/DeepPurple900</item>
<item name="colorAccent">@color/Orange</item>
</style>
<style name="AppTheme" parent="AppTheme.Base"></style>
在res目录下,创建一个values-v21目录,再创建一个style.xml:
<style name="AppTheme" parent="AppTheme.Base">
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">?colorPrimaryDark</item>
</style>
然后在AndroidManifest.xml文件中修改application的theme属性为上面定义的AppTheme.即可实现沉浸式状态栏。
3.依赖库与SDK
常选的库:
gradle-retrolambda
Android的lambda表达式插件Glide
Android最屌图片加载库butterknife
View注解库和配套插件[android-butterknife-zelezny]okhttp
网络请求'com.android.support:design:23.0.1'
谷歌Material Design控件库EasyRecyclerView
支持下拉上拉刷新等功能全面的RecyclerViewSwipeBackHelper
Activity滑动关闭支持库,能达到微信效果RxJava
观察者模式的事件消息交互框架RxAndroid
支持在Android 中通过Rx切换到主线程RxBus
提供如EventBus一般使用的Rx框架RxPermissions
提供在Rx上来管理Android M (Android6.0)的动态权限框架RxLifecycle
解决Rx因为观察者在订阅后Fragment持有context导致内存泄漏的问题Eventbus
翻译为事件总线,用于解决android中的事件交互和回调.同Rx一样也是观察者模式retrofit
android中的通讯注解框架,用于发送http请求.配合Rx能达到高效的开发速度BaseRecyclerViewAdapterHelper
如名字一样他是RecyclerView的适配器超类库.支持各种姿势写adapter,轻松减少大量重复代码.
AndroidAutoLayout
国内大神张鸿洋出的布局框架.很不错.减少大量布局调优工作zxing
老牌二维码扫描框架compressor
图片压缩框架,压缩率很高.支持配置.Api友好RxBinding
可以实现数据层与View层的绑定,当数据发生变化,View会自动更新UI。还有其他功能非常强大(MVVM)PhotoView
可根据手势进行缩放的图像库,这个也很常见
-
AndroidImageSlider
展示头部Banner的库,动画效果很多,不过需要依赖picasso和nineoldandroids这两个库
FlycoTabLayout
样式比TabLayout多样的Tab库ijkplayer
B站出品的视频解码库DanmakuFlameMaster
同样B站出品的弹幕库ShineButton
炫酷效果的点击按钮,主要用于显示收藏之类的动画Android-SpinKit
集成多种动画效果的Drawable,之前有看源码觉得代码封装得挺好,动画不仅仅只能用在View上Tinker
微信Android热补丁方案,功能强大,和其它热修补方案对比看这里wikiJsoup
抓取网页数据SwitchButton
SwitchButton按钮MaterialSpinner
一个通用的SpinnerTagLayout
标签布局功能,还可以单独作为特殊点击效果的按钮Tiny
图片处理框架,让你压缩图片等不再是问题
融云——即时通讯
友盟——数据统计,推送,意见反馈,自动更新,第三方分享及登录,社区
七牛——云存储
Mob——短信验证
Bmob——做后台不求人
依赖这一大堆库和SDK以后。建议在合适的时机初始化他们,而不是全堆在Application的onCreate()里面。这样会导致启动时间过长。启动后也会较卡。虽然是不会影响功能正常使用。
4.配置Gradle
某些SDK运行时需要检查签名是否正确。所以在debug模式时也必须用正式KEY签名。而把签名放进版本控制不是明智的做法。所以推荐下面的做法:在app的gradle加入下面代码
Properties props = new Properties()
props.load(new FileInputStream(file("signing.properties")))
android {
signingConfigs {
release{
keyAlias props['KEY_ALIAS']
keyPassword props['KEY_PASSWORD']
storeFile file(props['KEYSTORE_FILE'])
storePassword props['KEYSTORE_PASSWORD']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.release
}
}
}
在app的gradle文件同级目录新建signing.properties文件,里面填入你的key的相应信息
KEYSTORE_FILE = C:\\Users\\Mr.Jude\\Documents\\Android\\HelloWorld.jksKEYST
ORE_PASSWORD = xxxxxx
KEY_ALIAS = xxxxxx
KEY_PASSWORD = xxxxxx
将signing.properties添加进忽略目录。其他人pull下来代码后。自己新建signing.properties填入相应信息后即可编译成功。
5.制定开发规范
命名规范
包名全部采用小写
常量、枚举等均采用大写形式,用下划线区分各单词。使用static final
private static final String TAG = "XXXX"
- 类名、接口名、枚举名。第一个和后面的单词都要第一个字母大写
MainActivity,InstalledAppDetails
- 资源文件命名
activity_main
fragment_account
item_person
include_toolbar
view_progress
不过对于庞大项目的开发。近百个activity开头的layout列表还是会眼瞎。所以那种情况会在前面加上模块名。
id命名,例
btn_send
tv_name
list_persons
et_password
- 然后用butterknife的插件生成变量会自动将下划线变成驼峰命名
变量命名:以m开头。例
mAdapter
注意图片文件命名只能用小写字母、数字,否则会导致R文件无法编译出来
继承自安卓组件的类,一般采用父类名作为后缀,
class LoginActivity extends Activity{}
自定义异常必须以Exception结尾
全局变量添加所有者前缀:实例成员变量前缀m(表示member),类静态变量前缀s(表示static)
protected ContentResolver mContentResolver;
- 控件变量添加组件前缀,控件前缀+控件属性,控件缩写
button->btnLogin,或者bt_login;
- 全局名称mBtnNext局部名称
btnNext
- 构造方法采用递增方式(参数多的写在后面),参数少的调用参数多的构造函数。这样也减少初始化代码。比如开源库
PagerSlidingTabStrip
编码规范
源文件编码格式为 UTF-8。
服务端可以实现的,就不要放在客户端
引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大
处理应用全局异常和错误,将错误以邮件的形式发送给服务端
图片的.9处理
使用静态变量方式实现界面间共享要慎重
单元测试(逻辑测试、界面测试)
不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突
activity中在一个View.OnClickListener中处理所有的逻辑
strings.xml中使用%1$s实现字符串的通配
数据一定要效验,例如字符型转数字型,如果转换失败一定要有缺省值;
服务端响应数据是否有效判断
对于未完成的方法,使用TODO加以标记
若功能已完成,但存在效率等潜在问题时,使用XXX加以标记
若代码存在严重问题或仅用于调试,使用FIXME加以标记values目录下文件名称较固定,不得随意更改
提交规范
代码及时更新,不要和服务器有太大的差别,减少merge的log
提交代码时,如果出现冲突,必须仔细分析解决,才可提交
提交代码之前先在本地进行测试,确保项目能编译通过,且能够正常运行,本地没有验证的代码原则上不允许提交
必须保证服务器上的版本是正确的,项目有错误时,不要进行提交
提交之前先更新代码提交时注意不要提交本地自动生成的文件,比如我们AndroidStudio项目中的 idea,build文件夹是不需要提交的
不要提交自己不明白的代码
提前协调好项目组成员的工作计划,减少冲突
对提交的信息尽量写得详细,方便后续定位问题;最好使用提交模板
[CAUSE] :
[SOLUTION] :
[REVIEW] : Own
[SIDEEFFECT]: without side effects
[PROJECT] : V3
[CR] :V3 SM-2182
[MODULAR] :
modified: src/com/android/settings/applications/InstalledAppDetails.java
架构设计规范
为了避免合作开发写的代码风格迥异。或做出了多套开发模式。下面是个例子。毕竟是为了高效开发而制定的。适合自己项目的才是最好。
所有Activity继承BaseActivity
所有Fragment继承BaseFragment
所有Presenter继承BasePresenter
这样利于生命周期管理。也可以方便的全局修改。命名,例
AccountFragment
UserDetailActivity
通过引入 Event Bus(事件总线,这个项目使用的是otto)。它允许我们在Data Layer中发送事件,以便View Layer中的多个组件都能够订阅到这些事件。比如DataManager 中的退出登录方法可以发送一个事件,订阅这个事件的多个Activity在接收到该事件后就能够更改它们的UI视图,从而显示一个登出状态。 当然你也可以有很多的选择,EventBus,Otto,自定义RxBus等。减少回调。
定好网络请求写法。文件存储方式与位置。写好项目所使用的类库框架用法。
- 对于有键盘的页面,默认不弹键盘
android:windowSoftInputMode="stateHidden|adjustResize"
维护性
1.代码规范 2.框架稳定性 3.封装 4.耦合
扩展性:
1.抽象接口 2.元素重用 3.单一职责 4.替换性 5.耦合
安全性:
1.数据安全性 数据安全就包括数据抓取、数据拦截以及数据修改 2.操作安全性 避免对一个操作重复执行
6.style 文件
针对style文件越来越大,可以将其分离如styles.xml
, styles_home.xml
, styles_item_details.xml
, styles_forms.xml
不同的资源目录在res/values
中是任意的
7.意识到WebView的问题
- 加载网页时不要处理HTML文件
- 避免使用WebView显示简单的Text和Button
8.测试框架
- Android Gradle发布了connectedAndroidTest ,是JUnit的一个扩展,可以测试程序员创建的JUnit Test
- 使用** Robolectric**进行单元测试,而非UI测试
- 使用Robotium进行UI测试
其他
android:screenOrientation="portrait" //强制竖屏(只针对activity)
android:exported="true"//在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。(四大组件都有这个属性)
android:launchMode="singleTask"//主界面
android:largeHeap="true" //可以使用的最大内存值
android:hardwareAccelerated="true" //启动硬件加速,(占用内存)
android:windowSoftInputMode="adjustPan|stateHidden"//输入法问题
android:supportsRtl="true"//支持从右到左right-to-left )的布局
android:process="com.github.obsessive.simplifyreader.application" //应用进程
android:animateLayoutChanges="true"//View的伸展动画