Android开发规范(自用)
一、命名规范
1. 项目名
(1) App 项目以产品对应英文命名,例:
教学中⼼ TeachingCenter
(2) 模块以 模块名 命名,例:
公共模块 common
用户模块 user
(3) 组件以 library- + 组件 命名,例:
公共组件 library-common
日历组件 library-calendar
2. 类名
采⽤⼤驼峰命名规范,尽量避免缩写,除非该缩写是众所周知的, 比如 URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。
类 | 描述 | 例如 |
---|---|---|
Activity 类 |
Activity 为后缀标识 |
欢迎页面类 WelcomeActivity
|
Adapter 类 |
Adapter 为后缀标识 |
公告详情适配器 AnnouncementAdapter
|
工具方法类 |
Utils 或 Manager 为后缀标识 |
线程池管理类:ThreadPoolManager 日志工具类: LogUtils (Logger 也可)打印工具类: PrinterUtils
|
数据库类 | 以 DBHelper 后缀标识 |
信息数据库:InfosDBHelper
|
Service 类 |
以 Service 为后缀标识 |
时间服务 TimeService
|
broadcastReceiver 类 |
以 Receiver 为后缀标识 |
推送接收 JPushReceiver
|
ContentProvider 类 |
以 Provider 为后缀标识 |
ShareProvider |
自定义的共享基础类 | 以 Base 开头 |
BaseActivity , BaseFragment
|
3. 接口(interface)
命名规则与类一样采用大驼峰命名法,但必须冠以前缀I ,比如ISomeInterface
,接口的实现 类则是去掉前缀I但添加后缀Impl
,比如SomeInterfaceImpl
。
注意:如果项目采用 MVP,所有 Model、View、Presenter 的接口都以 I 为前缀,不加后缀,其他的接口采用上述命名规则。
4. 方法名
方法名都以 lowerCamelCase
风格编写。
方法 | 说明 |
---|---|
initXX() |
初始化相关方法,使用 init 为前缀标识,如初始化布局 initView()
|
isXX() , checkXX()
|
方法返回值为 boolean 型的请使用 is/check 为前缀标识 |
getXX() |
返回某个值的方法,使用 get 为前缀标识 |
setXX() |
设置某个属性值 |
handleXX() , processXX()
|
对数据进行处理的方法 |
displayXX() , showXX()
|
弹出提示框和提示信息,使用 display/show 为前缀标识 |
updateXX() |
更新数据 |
saveXX() , insertXX()
|
保存或插入数据 |
resetXX() |
重置数据 |
clearXX() |
清除数据 |
removeXX() , deleteXX()
|
移除数据或者视图等,如 removeView()
|
drawXX() |
绘制数据或效果相关的,使用 draw 前缀标识 |
5. 常量
常量名全部大写字母,单词间以下划线分割,如:CONSTANT_VALUE_A
6. 控件
为了更好地区分 UI 控件和普通成员变量,所有用来表示控件的成员变量统一加上控件缩写作为前缀。
名称 | 缩写 |
---|---|
Button | btn |
CheckBox | cb |
EditText | et |
FrameLayout | fl |
GridView | gv |
ImageButton | ib |
ImageView | iv |
LinearLayout | ll |
ListView | lv |
ProgressBar | pb |
RadioButtion | rb |
RecyclerView | rv |
RelativeLayout | rl |
ScrollView | sv |
SeekBar | sb |
Spinner | spn |
TextView | tv |
ToggleButton | tb |
VideoView | vv |
WebView | wv |
7. 数据类型
对于表示集合或者数组的非常量字段名,我们可以添加后缀来增强字段的可读性,比如:
集合添加如下后缀:List、Map、Set。
数组添加如下后缀:Arr。
例如:userList
、userArr
、firstNameSet
。
8. 资源文件
资源文件命名为全部小写,采用下划线命名法。
如果是组件化开发,可以在组件和公共模块间创建一个 ui 模块来专门存放资源文件,然后让每个组件都依赖 ui 模块。这样做的好处是如果老项目要实现组件化的话,只需把资源文件都放入 ui 模块即可。
8.1 动画资源文件(anim/ 和 animator/)
安卓主要包含属性动画和视图动画,其视图动画包括补间动画和逐帧动画。属性动画文件需要放在 res/animator/
目录下,视图动画文件需放在 res/anim/
目录下。
命名规则:{模块名_}逻辑名称
。
说明:{}
中的内容为可选,逻辑名称
可由多个单词加下划线组成。如:activity_bottom_in.xml
、activity_top_out.xml
8.2 图片资源文件
res/drawable/
目录下放的是位图文件(.png、.9.png、.jpg、.gif)或编译为可绘制对象资源子类型的 XML 文件,而 res/mipmap/
目录下放的是不同密度的启动图标,所以 res/mipmap/
只用于存放启动图标,其余图片资源文件都应该放到 res/drawable/
目录下。
命名规则:类型{_模块名}_逻辑名称
、类型{_模块名}_颜色
({}
内容可选)。例如:btn_red.png
、bg_input.png
、divider_white.png
等
8.3 布局资源文件(layout/)
命名规则:类型_模块名
、类型{_模块名}_逻辑名称
。
例如:activity_main.xml
fragment_live_list.xml
二、编码规范
1. 类成员顺序
推荐使用如下排序:
class MainActivity : Activity() {
val TAG: String = this.javaClass.simpleName
private var mTitle: String = ""
private lateinit var mTextViewTitle: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
private fun setTitle(title: String) {
mTitle = title
}
private fun setUpView() {
}
inner class AnInnerClass {
}
}
2. 编写简短方法
在可行的情况下,尽量编写短小精炼的方法。如果某个方法的代码超出 40 行,请考虑是否可以在不破坏程序结构的前提下对其拆解。
3. 键值对字符串常量
针对常用的键值对函数,比如 SharedPreferences
、Bundle
、Intent
等,请参考以下规则:
类 | 字段名前缀 |
---|---|
SharedPreferences | PREF_ |
Bundle | BUNDLE_ |
Fragment Arguments | ARGUMENT_ |
Intent Extra | EXTRA_ |
Intent Action | ACTION_ |
例如: |
companion object{
// 注意:字段的值与名称相同以避免重复问题
const val PREF_EMAIL = "PREF_EMAIL"
const val BUNDLE_AGE = "BUNDLE_AGE"
const val ARGUMENT_USER_ID = "ARGUMENT_USER_ID"
// 与意图相关的项使用完整的包名作为值的前缀
const val EXTRA_SURNAME = "com.myapp.extras.EXTRA_SURNAME"
const val ACTION_OPEN_USER = "com.myapp.action.ACTION_OPEN_USER"
}
4. 换行
4.1 操作符换行
除赋值操作符之外,我们把换行符放在操作符之前,例如:
val longName = anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne
+ theFinalOne;
赋值操作符的换行我们放在其后,例如:
val longName =
anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne + theFinalOne;
4.2 函数链的换行
当同一行中调用多个函数时(比如使用构建器时),对每个函数的调用应该在新的一行中,我们把换行符插入在 .
之前。
例如:
Glide.with(context)
.load("https://blankj.com/images/avatar.jpg")
.into(ivAvatar);
4.3 RxJava 链式的换行
RxJava 的每个操作符都需要换新行,并且把换行符插入在 .
之前。
例如:
fun doSomething() {
apimanager.getInstance().liveVideoService
.updateApplyStatus(url, liveKey, applyStatus)
.compose(RxHelper.defalutHandleResult<Any>())
.subscribe(object : RxSubscriber<Any>(this) {
override fun _onNext(t: Any?) {
}
override fun _onError(message: String?) {
}
})
}
三、注释
1. 类注释
/**
* author : dell
* time : 2022/08/24
* desc : 欢迎页面
*/
class WelcomeActivity : Activity() {
}
2. 方法注释
/**
* bitmap 转 byteArr
*
* @param bitmap bitmap 对象
* @param format 格式
* @return 字节数组
*/
fun bitmap2Bytes(bitmap: Bitmap?, format: Bitmap.CompressFormat?): ByteArray? {
if (bitmap == null) return null
val baos = ByteArrayOutputStream()
bitmap.compress(format, 100, baos)
return baos.toByteArray()
}
3. 其他注释
// Todo: 2022/8/24 待处理
// FIXME: 2022/8/24 待修复
四、版本统一规范
Android 开发存在着众多版本的不同,比如 compileSdkVersion、minSdkVersion、targetSdkVersion 以及项目中依赖第三方库的版本,不同的 module 及不同的开发人员都有不同的版本,所以需要一个统一版本规范的文件。如:
ext {
// Sdk and tools
compile_sdk_version = 29
build_tools_version = '29.0.2'
min_sdk_version = 22
target_sdk_version = 29
version_code = 10
version_name = '1.0.0'
// App dependencies
support_version = '26.1.0'
leakcanary_version = '1.5.4'
}
原文地址:https://www.jb51.cc/wenti/3284107.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。