开发规范的目的是保证统一项目成员的编码风格,并使代码美观,易于项目维护。
1.项目结构
- app模块
manifests:
包含AndroidManifest.xml文件 (用于声明应用程序的组件和权限)
java:
java目录存放Java源代码
res:
res目录则存放各种资源文件,如布局、图像、字符串等
第三方库模块(导入的与app模块同级,结构一致)
Gradle脚本
Gradle是一种自动化构建工具,用于编译和管理Android项目。Gradle脚本主要在build.gradle文件中定义,包括项目级和模块级的build.gradle。这些脚本描述了项目的编译规则
- 配置文件
settings.gradle:
settings.gradle文件指定了需要编译的模块
gradle.properties:
gradle.properties用于配置编译工程的命令行参数
local.properties:
local.properties用于指定本机中的Android SDK路径
- 测试和库文件
androidTest目录:
androidTest目录用于编写Android测试用例
libs目录:
libs目录用于存放第三方jar包;
libs目录下的jar包会自动添加到构建路径中
- 其他目录和文件
.idea .gradle .build:
这些是Android Studio自动生成的文件或编译生成文件
2.开发环境规范
- 编辑器及版本:
Android studio 4.0.1
- 编码格式:
UTF-8
- 开发语言:
java
- jdk版本:
jdk 1.8
- gradle版本:
gradle-6.1.1-all
- sdk版本:
16-30
3.第三方框架规范
- 项目设计模式:
mvc
和mvvm
- 网络框架:
rxjava + retrofit
和okhttp
- UI绑定框架:
butterknife
- 图片展示框架:
glide
- 图片压缩框架:
Luban
和compressor
- JSON解析框架:
gson
- 消息通信:
eventbus
4.代码规范
4.1 文件编码:
UTF-8
4.2 包名:
包名全部小写,连续的单词只是简单地连接起来,不使用下划线。采用反域名命名规则,全部使用小写字母。
4.3 类名:
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。 名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的.例:MainActivity 类名+后缀标识
4.4 方法名:
方法名通常是动词或动词短语。小驼峰命名初始化相关方法,使用init 为前缀标识, 如初始化布局 initView(方法返回值为 boolean 型的请使用is或 check为前缀标识返回某个值的方法, 使用 get 为前缀标识清除数据相关的 clearXX()removeXX()
4.5 常量名:
全部字母大写,用下划线分隔单词例:static final int NUMBER= 5;
4.6 资源文件命名:
全部小写,采用下划线命名法必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。所有 Activity 或 Fragment 的 contentView 必须与其类名对应,对应规则为:将所有字母都转为小写,将类型和功能调换(也就是后缀变前缓)。
1.contentview 命名: 例如:activity_main.xml
2.Dialog 命名: dialog_描述.xml 例如:dialog_hint.xml
3.PopupWindow 命名:ppw_描述.xml 例如:ppw_info.xml
4.列表项命名:item_描述.xml 例如:item_city.xml
5.layout 中的 id 命名命名模式为:view 缩写_view 的逻辑名称:例如:main_msg
4.7 注释:
* @author 创建人: XXX
* @mobile 联系电话:199999999XX
* @email 邮箱:199999999XX@163.com
* @createTime 创建时间: 2022/6/28
* @describe 描述:APP主界面
5.基本组件规范:
- Activity
#onSaveInstanceState()
方法不是 Activity 生命周期方法,它是用来在 Activity 被意外销毁时保存 UI 状态的,只能用于保存临时性数据,例如UI控件的属性等,不能跟数据的持久化存储混为一谈。持久化存储应该在 Activity#onPause()/onStop()
中实行. - 避免在
Service
#onStartCommand()/onBind()
方法中执行耗时操作,如果有需求,应改用IntentService
或采用其他异步机制完成. - 避免在
BroadcastReceiver#onReceive()
中执行耗时操作,如果有耗时工作,应该创建IntentService
完成,而不应该在BroadcastReceiver
内创建子线程去做. - 避免使用隐式
Intent
广播敏感信息,信息可能被其他注册了对应BroadcastReceiver
的App
接收,如果广播仅限于应用内,则可以使用LocalBroadcastManage
r#sendBroadcast()
实现,避免敏感信息外泄和 Intent拦截的风险. - 不要在
Activity
#onDestroy()
内执行释放资源的工作,例如一些工作线程的销毁和停止,因为onDestroy()
执行的时机可能较晚。可根据实际需要,在Activity
#onPause()/onStop()
中结合isFinishing()
的判断来执行. -
Activity
或者Fragment
中动态注册BroadCastReceiver
时,registerReceiver()
和unregisterReceiver()
要成对(生命周期对应)出现.Activity 的生命周期不对应,可能出现多次onResume
造成receiver
注册多个,但最终只注销一个,其余receiver
产生内存泄漏。
6.其他:
- 删除多余的import,减少警告出现,可利用 AS 的Optimize Imports(Settings -> Keymap -> Optimize Imports)快捷键
- 新建项目以最新的Android SDK为准,及时适配最新SDK,并遵循最新的Android开发规范
- id 命名
view缩写{_模块名}_逻辑名
, 例如:btn_main_search、btn_back
。