Android端代码规范

有好的建议可以提、集思广益,逐渐补充完善项目的代码规范

代码注意事项

  • 代码必须格式化、去除无效引用
  • dialog 统一使用半透明activity()
  • 通用common抽象,只能放公共类,不要放业务相关
  • 相关联的逻辑应该在一起,不相关联的逻辑不应该混在一起
  • 严禁使用new handler()、new Thread(),可以项目使用项目里的ThreadUtils
  • 第三方代码必须二次封装后再使用
  • recycleView有各种写法,统一(BaseRecyclerViewAdapterHelper就挺好的)
  • eventbus一定不要重复,分场景定义
  • 避免重复添加fragment导致的崩溃,建议调用FragmentTransaction.add方法,先判断fragment.isAdded()
  • 如果使用Java语言,在所有使用 Object的地方,必须进行判空,除非你能非常确定对象不会为空,推荐使用项目里的ObjectUtils.isNotEmpty()
  • kotlin严禁使用避免使用 !!
  • 使用图片加载时用ImageLoadingUtil,不要直接使用glide
  • Bundle不要传递过大参数。控制在500K以内,过大的时候可以选中存储为文件,然后传递文件路径在解析
  • 写工具类先看工具类有没有,不要重复添加
  • 全局获取:ContextManager.getApplication()
1
2
3
4
5
6
7
8
9
10
11
ActivityUtils activity 类

ObjectUtils 判空工具类

ContextManager application 代理类,页面监听代理

MetaDataUtils 获取清单文件内的配置

cThreadUtils 线程池

CommonLoadingDialog 通用loading 弹窗,不要再布局里面再放一个lottie view
  • 待补充…

分包

按功能分包

好处:

  1. 高内聚、低耦合,哪块要添新功能,只改某一个 package 下的东西
  2. 很容易删除功能
  3. package 的大小有意义了,包里 class 太多,表示这块需要重构(划分子包)

命名

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。

类名:大写驼峰

模块名 + 功能(Activity、Fragment、Adapter)

方法名:小写驼峰

方法名通常是动词或动词短语。

方法 说明
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 前缀标识

变量名:小写驼峰

静态变量、常量:大写下划线 A_B

其他命名

命名要明白,见名知其意,例如:

工具类:util

管理类:Manager

资源

图片(drawable/ 和drawable-xxhdpi/)

命名规则:类型{_模块名}_逻辑名称类型{_模块名}_颜色{} 中的内容为可选

位置:公用的放在common,自己的模块用到的放自己模块

名称 说明
btn_main_about.png 主页关于按键 类型_模块名_逻辑名称
btn_back.png 返回按键 类型_逻辑名称
divider_maket_white.png 商城白色分割线 类型_模块名_颜色
ic_edit.png 编辑图标 类型_逻辑名称
bg_main.png 主页背景 类型_逻辑名称
btn_red.png 红色按键 类型_颜色

选择器

sel_btn_xx 作用在 btn_xx 上的 selector
btn_xx_normal 默认状态效果
btn_xx_pressed state_pressed 点击效果
btn_xx_focused state_focused 聚焦效果
btn_xx_disabled state_enabled 不可用效果
btn_xx_checked state_checked 选中效果
btn_xx_selected state_selected 选中效果
btn_xx_hovered state_hovered 悬停效果
btn_xx_checkable state_checkable 可选效果

布局资源文件(layout/)

命名规则:类型_模块名_功能(可选)

activity activity_模块名 例如 R.layout.activity_login
fragment fragment_模块名 例如 R.layout.fragment_login
include layout_模块名_功能名 例如 R.layout.layout_login_bottom
adapter item_模块名_功能名 例如 R.layout.item_simple_text
dialog dialog_模块_功能名 例如 R.layout.dialog_time_picker
widget widget_模块_功能 例如 R.layout.widget_app_clock

布局资源 id 命名

id 命名直接采用小写驼峰样式,因为使用viewBinding直接就可以就可以获取ID,不需要再重新转一下了

控件Id命名:控件缩写_(模块名)_功能名

TextView EditText ImageView Button ListView CheckBox LinearLayout RelativeLayout FrameLayout
tvShopName et iv btn lv cb ll rl fl

strings.xml

<string> 的 name 命名使用下划线命名法,采用以下规则:{模块名(moudle)_}逻辑名称,这样方便同一个界面的所有 string 都放到一起,方便查找。

名称 说明
main_menu_about 主菜单按键文字
friend_title 好友模块标题栏
friend_dialog_del 好友删除提示
login_check_email 登录验证
dialog_title 弹出框标题

注释规范

类注释

每个类完成后应该有作者姓名和描述的注释,对自己的代码负责,也好找人。

具体可以在 AS 中自己配制,进入 Settings -> Editor -> File and Code Templates -> Includes -> File Header,输入

1
2
3
4
5
/**
* desc : 类描述
* time : ${YEAR}/${MONTH}/${DAY}
* author : ${USER}
*/

方法注释

不强制,因为有些方法一看就知道是干啥的,在方法前一行输入 /** + 回车 ,AS 便会帮你生成模板,我们只需要补全参数即可

变量注释

//

提测的代码todo

建议,不强制,不要无效的todo 

代码样式规范

编写简短方法

在可行的情况下,尽量编写短小精炼的方法。有些情况下较长的方法是恰当的,因此对方法的代码长度没有做出硬性限制。如果某个方法的代码超出 40 行,请考虑是否可以在不破坏程序结构的前提下对其拆解。

类成员的顺序

推荐使用如下排序:

  1. 常量(Kotlin 伴生对象放在开头)
  2. 字段
  3. 构造函数
  4. 重写函数和回调
  5. 方法

如果类继承于 Android 组件(例如 Activity 或 Fragment),那么把重写函数按照他们的生命周期进行排序是一个非常好的习惯,例如,Activity 实现了 onCreate()onDestroy()onPause()onResume(),它的正确排序如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends Activity {
//Order matches Activity lifecycle
@Override
public void onCreate() {}

@Override
public void onResume() {}

@Override
public void onPause() {}

@Override
public void onDestroy() {}
}

函数参数的排序

在 Android 开发过程中,Context 在函数参数中是再常见不过的了,我们最好把 Context 作为其第一个参数。

正相反,我们把回调接口应该作为其最后一个参数。

1
2
3
4
5
// Context always goes first
public User loadUser(Context context, int userId);

// Callbacks always go last
public void loadUserAsync(Context context, int userId, UserCallback callback);

Android端代码规范
http://peiniwan.github.io/2024/04/f34bd957d469.html
作者
六月的雨
发布于
2024年4月6日
许可协议