Android 编码规范

2023-11-18

背景

公司项目开始时间较早,之前开发时候没有具体的代码规范,历经多次人员更替之后,现在的项目代码显得有一些紊乱,所以我打算制定代码规范标准,所有人按照规范编码,提高代码质量,提升代码的可读性,便于后期的代码维护。

制定规范

一、开发环境

开发工具:Android Studio
编码格式:UTF-8

二、命名规范

1.资源命名

要求:分类明确,取名直观,防止重复
命名组成:小写字母+数字+下划线

类型 命名规范 举例 备注
drawable 类型_属性_ btn_back_click / shape_r15_33333 / shape_r15_b1_33333
mipmap 类型_功能_属性 ic_message_white / bg_dialog_header
anim 类型_功能_属性 anim_activity_in / anim_dialog_out
string 模块名_page名_功能 mine_userinfo_usename
color color_具体色值 / color_具体色值_al透明度 color_333333 / color_333333_a50 基本只有这两种
style style_功能_属性描述 style_text_12_33333
layout 分类_page_功能 activity_main / fragment_mine / item_setting_userinfo / layout_titlebar 必须以明确分类为开头
viewId view缩写_功能 tv_title / btn_click

viewId开头规范

View类型 开头 举例
FrameLayout fl fl_main_user
LinearLayout ll ll_main_user
RelativeLayout rl rl_setting_phone
TextView tv tv_title
EditTextView etv etv_phone
Button btn btn_back
ImageView iv iv_menu
RecyclerView rv rv_main
CheckBox cb cb_gender
ScrollView sv sv_main
SmartRefreshLayout srl srl_mine

2.包命名

命名规则:一个唯一包名的前缀总是全部小写的 ASCII字母并且是一个顶级域名,通常是com。
例如com.cmcc.xxx
规约:包命名必须以com. cmcc开始,后面跟项目名称cmcc.XXX(或者缩写),再后面为模块名或层级名称。
如:com.cmcc.项目缩写.模块名→com.cmcc.base
如:com.cmcc.项目缩写.模块名→com.cmcc.view

3.方法命名

遵循小驼峰规则,且取名必须与方法功能相符

类型 命名规范 举例 备注
void 按功能,有实际意义 initViews / getUserInfo / setValuesToViews

4.类命名

要求:大驼峰,有实际意义
包括:class、interface、enum

类型 命名规范 举例 备注
基类 按功能,有实际意义 BaseActiivty / BaseFragment / BaseHoder / BaseData / BaseItem
组件、页面类 功能+页面类型 MyApplication / MainActivity / DiscoveroyFragment / DeviceHolder / HomePageAdapter
功能类 按功能,有实际意义 RecyclerItemClickListener / TextViewUtils / ActivityManager / PageValueTypeEnum
自定义View 按照控件实际功能命名 MyViewPager / CountDownTextView / CameraView / TitleBarView

5.变量

类型 举例 备注
临时变量 i,j,k,l,m,n,o 应用在for循环中居多
其他变量 mContent / pageType / loginDeviceName 遵循小驼峰规则

6.常量

大写并用下划线分隔

举例
PACKAGE_NANE
SP_KEY_USER_NAME
SP_KEY_USER_GENDER
PAGE_TYPE_HOME
PAGE_TYPE_MINE
PAGE_TYPE_TITLE

二、编码规范

1.XML布局中尽量减少层级。
2.布局控件数量大于10个时,使用ConstraintLayout,否则使用其他Layout,考虑使用优先级:FrameLayout>LinearLayout>RelativeLayout>其他。
RecyclerViewHolder的布局文件中,不要使用ConstraintLayout。
3.布局文件中,TextView的text属性,禁止直接写死字符串,必须添加@string引用
// 4.使用AppCompatXXXView代替XXXView(暂不做要求)
5.同属性超过4个时,需要使用style
6.及时删除多余import及代码格式化,每次编码完成后习惯性Ctrl+Alt+O,Ctrl+Alt+L
7.每个方法总行数不能超过80行
8.单行代码长度不能超过一屏幕(160字符),若过长需及时换行
9.if语句必须添加大括号,即使逻辑只有一行代码,也需要,例如:

if(needRefresh){
	refresh();
}

10.非空判断,使用NullUtils.isNotNull(XX);
11.禁止使用strinng.equals(string),字符串比较使用TextUtils.equals(string1,string2);
12.禁止直接使用TextView.setText();,TextView设置字符串使用TextViewUtils.setText(tv, str);
13.禁止在自定义View的onDraw方法里创建新对象
14.禁止在RecyclerViewHolder的onBindView中创建新对象
15.禁止在size超过10的for循环中创建新对象
16.弃用或不推荐方法,及时添加@Deprecated注解,如有新方法代替,请在注解中添加{@link XXX}
17.数据类型,不要直接使用int,须定义枚举
18.遇到需要使用HashMap的地方,使用ArrayMap代替
19.代码中遇到字符串拼接,禁止直接写死字符串,必须使用Resource.getString(R.string.str);
20.布局文件中,所有的宽高、字体大小必须引用@deimen

android:layout_width="@dimen/x100'
android:textSize="@dimen/x16"

21.单行TextView,必须设置minHeight
22.多行TextView,必须设置行间距,引用@style/base_module_text_line_spacing_multiplier
23.提交代码中不能包含原生的Log打印,日志打印使用已封装的MyLog

三、注释规范

一眼就能看出实际意义的方法不需要添加注释,例如:在findViewById(int viewId)
提测代码原则上不包含TODO注释(延期需求除外)

1.类注释:

必须添加创建人署名和联系方式

/**
 * @author 创建人: XXX
 * @mobile 联系电话:199999999XX
 * @email 邮箱:199999999XX@163.com
 * @createTime 创建时间: 2022/6/28
 * @describe 描述:APP主界面
 */
 public class MainActivity {
 }

可在studio中添加设置

2.方法注释:

必须包含方法用途
必须申明每一个参数变量的意义

/**
 * 获取在线设备名称
 * 
 * @param deviceList 设备列表
 * @param position 下标
 * @return 设备名称
 */
private String getOnlineDeviceName(ArrayList<DeviceInfo> deviceList, int position){
	... // 其他逻辑
	return deviceList.get(position).name;
}

方法定义完成后,可通过AS的代码提示直接生成,生成后完善即可。

2.变量注释:

必须使用文档注释

/** 是否启动自动进入 */
public static final String IS_CHANGE_FROM_START = "is_change_from_start";

 /**
 * 是否启动自动进入
 */
public static final String IS_CHANGE_FROM_START = "is_change_from_start";

3.区块注释:

使用单行注释或多行注释

private void run(){
 // 单行注释
	xxx();
}
private void run(){
	/*
	 * 多行注释
	 * /
	 xxx();
 }

四、代码提交规范

1.未经测试的代码,禁止提交,确保提交的代码不影响其他人正常开发流程
2.代码提交之前,必须先fetch并rebase,合并至最新代码后再push
3.提交 commit 规范为:

[需求] 需求名称以及内容
[集成] 变动SDK名称
[优化] 优化功能点
[修复] 修复bug内容

五、其他须遵循的JAVA规范

1.代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
2.代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
3.杜绝不规范的英文缩写:AbstractClass 缩写成AbsClass;condition缩写成condi;此类随意缩写严重降低了代码的可阅读性。
4.关于Service或Dao层的命名
插入:insert(推荐)或save
删除:delete
修改:update(推荐)或modify
查询单个对象:get
查询多个对象:list
5.避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

END

参考

https://blog.csdn.net/Android_XG/article/details/121784873

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 编码规范 的相关文章

  • Android 中通过 OpenMAX 访问相机

    我目前正在尝试弄清楚如何在 Android 4 0 中通过 OpenMAX 访问相机 该文档对我来说还不够 所以我目前正在努力解决如何检索正确的问题XADataSource对于以下调用 engine gt CreateMediaRecord
  • RecyclerView 中的单选

    我知道没有默认的选择方法RecyclerView类 但我尝试过以下方式 public void onBindViewHolder ViewHolder holder final int position holder mTextView s
  • 是否可以在 Android 或 Blackberry 上运行小程序?

    Java站点是这样的java com http www java com says KVM 移动设备的虚拟机 与 JVM Java 虚拟机 相对应 它用于在移动设备上运行用 Java 技术编写的小程序和应用程序 KVM 必须由制造商安装 它
  • 不带 Firebase 的集成 AdMob:不需要的权限 (C2D)

    我正在使用 Firebase 将旧游戏从 AdMob 移植到最新的 AdMob 我使用的是已弃用的 AdMob 版本 我想要尽可能最小的集成 我不需要 Firebase 分析 我有一个工作集成 使用 Android Studio 项目 但是
  • NavigationUI 无法与底部导航视图实现一起正常工作

    所以我有一个场景 其中我有 5 个带有底部导航的片段 1 主页 2 收件箱 3 搜索 4 通知 5 个人资料 因此 我有另一个名为 BarcodeDetail 的片段 我从 Home Fragment 导航到该片段 首页 gt 条码详情 现
  • Android Studio 无法下载并附加某些库的源代码

    就我而言 是这样的源代码是这样的 https i stack imgur com Xuo0X png 然后 我单击 下载源 但看到此错误 error https i stack imgur com 26R68 png java util N
  • Cordova/Phonegap:在后台线程中运行 FileTransfer 插件

    我看到一个老问题没有解决 在后台线程中运行 PhoneGap FileTransfer https stackoverflow com questions 20355810 run phonegap filetransfer in back
  • onKeyEvent 和辅助服务

    我的用户将使用启用 TalkBack 的服务或其他一些无障碍服务 我想捕获我们应用程序中的 onKeyEvent 事件 但该事件被分派到启用的辅助功能服务 我创建了以下基本辅助服务 public class Accessibility Se
  • 如何在 Web 视图中向下滚动时隐藏 ActionBar/Toolbar

    在 Google Chrome 和 Play 商店中 该应用程序可以在滚动时隐藏操作栏 并允许用户方便地浏览 请帮助我这样做 我已经将 onTouchListener 用于 webview 但它不起作用 mWebView setOnTouc
  • 为什么android找不到com.google.gson.Gson

    我正在尝试在我的项目中使用 GSON 但我的应用程序崩溃了 logcat 说找不到 com google gson Gson 我已将 import com google gson Gson 放在我的类文件中 我的包资源管理器中有 gson
  • adb 可以检测的设备数量是否有上限

    我想知道 android adb 工具可以检测的设备数量是否有最大限制 我在谷歌上没有找到任何答案 我已经成功连接了 13 台设备 但我不知道它是否仍然适用于更多设备 Thanks 似乎没有 adb 限制 但有一个 USB 控制器限制 具体
  • 在 Android 中移动目录的最快方法?

    在 Android 中移动目录最快的方法是什么 在大多数情况下 但并非所有情况 源和目标位于同一 SD 卡文件系统上 目前 我的代码遍历整个目录结构 并将每个文件的内容复制到新位置的同名新文件中 然后它会验证文件大小是否匹配 然后删除源文件
  • 如何获取 Android 中其他应用程序的屏幕时间?

    我想达到在 Android 系统上运行的每个应用程序的屏幕时间 例如 Facebook 工作时间为 3 小时 但屏幕时间为 1 2 小时 我怎么才能得到它 android app usage 使用情况统计 public final clas
  • Android 中的离屏绘图

    android 中是否可以像 Objective C 中的 imageContext 那样进行离屏绘图 如果有的话 请告诉我链接或某种提示 多谢 我相信您正在寻找Canvas http developer android com refer
  • 使用loopj AsyncHttpClient获取SocketTimeoutExceptions...是否可以设置超时值?

    使用loopj时异步Http客户端 http loopj com android async http 库 我在发出请求时不断收到 java net SocketTimeoutException 见下文 我可以设置一些超时值吗 Note 我
  • 从绝对路径获取名称,从最后一个斜杠获取子字符串,java android

    我想提取绝对路径的名称 如果我有一个值为 mnt sdcard Videos Videoname 的字符串 我想保存一个值为 Videoname 的字符串 字符串正在变化 我之前无法获取斜杠的数量 如何从最后一个斜杠中分割子字符串 mnt
  • 当手机进入睡眠/待机模式时,活动/服务会发生什么?

    当手机 AP进入睡眠模式时 Android应用程序以及属于应用程序的活动和服务会发生什么 框架会破坏活动和服务并且操作系统会杀死进程吗 如果设备处于睡眠状态 将调用 Activity 的 onPause 读活动生命周期 http devel
  • 将下载进度条从 AsyncTask 更新到通知区域

    我已将异步任务实现到服务中 这是我正在调用的进度通知的初始化onPreExecute mProgressNotificationManager NotificationManager this getSystemService Contex
  • 如何解决webview内容重叠的问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 嗨 当背景设置为透明时 如何解决we
  • 滚动时重用视图时保存 RecyclerView 中所选项目的状态

    我为 recyclerView 创建了一个 Adapter 和 ViewHolder 我将 itemView 的 imageButton 绑定到 Viewholder 内 并在 onBindViewHolder 中设置了一个 onClick

随机推荐

  • [STM32系列]一、HAL库的串口中断接收

    STM32系列 一 HAL库的串口中断任意长度接收 1 前言 2 回调函数 3 HAL库中断接收函数使用 1 前言 HAL即硬件抽象层 英语 Hardware Abstraction Layer 实现了不同硬件的统一接口操作 这就极大的简化
  • 极简Json格式剖析与fastjson下载和使用

    Json存在的意义 Json主要用来做数据的传输 例如发送java中的一个对象 由于对象是存储在内存里的 不能直接将内存里的对象发送出去 这时需要使用序列化 持久化 手段 将对象转换为一系列字符串 比如说Json 在字符串送达目的地时再使用
  • HTTP协议和Tomcat服务器

    目录 1 HTTP 是什么 2 HTTP 工作过程 2 1 HTTP 协议格式 2 1 1 抓包工具的使用 2 1 2 抓包工具原理 2 1 3 抓包结果分析 2 1 4 协议格式总结 3 HTTP 请求 Request 3 1 请求地址
  • 常用的数组方法整理

    常用的数组方法 1 concat 2 join 3 pop 4 shift 5 unshift 7 reverse 8 sort 9 slice 10 splice 11 toString 12 valueOf 13 IndexOf 14
  • 二、Vue3跨组件调用函数[mitt]

    一 跨组件调用函数 安装 npm install mitt 创建文件并写入 bus js import mitt from mitt export const eventBus mitt 使用方法 import eventBus from
  • 2022年6月8日STM32——SPI读写串行FLASH 和 串行FLASH文件系统FatFs

    此内容是为自己方便回忆 如有错误 欢迎指导 内容来源于野火指南者开发板教程 一 SPI读写串行FLASH SPI Serial Peripheral Interface 串行外围设备接口 是高速全双工的通信总线 通讯速率较高 SPI物理层
  • VS2019中文输出乱码解决方法(C语言)

    现象 VS2019控制台输出中文乱码 第一种解决方法 安装插件Format on Save重启VS2019生效 注意 别装错了 刚开始我就装错了这个UTF 8 No BOM 装了这个插件的同学 记得要删掉 不然还是会出现问题 第二种解决方法
  • 等价类

    动态测试方法是指通过运行被测程序 检查运行结果与预期结果的差异 并分析运行效率 正确性和健壮性等性能 这种方法由三部分组成 构造测试用例 执行程序 分析程序的输出结果 静态方法是指不运行被测程序本身 仅通过分析或检查源程序的语法 结构 过程
  • 无线通信原理之OFDM技术

    补充一个完整的OFDM系统结构图 包括收发天线 目录 1 OFDM的基本原理 2 OFDM系统模型 3 循环前缀和导频 4 OFDM系统参数 1 OFDM的基本原理 OFDM即正交频分复用 Orthogonal Frequency Divi
  • React-错误边界与组件通信方式概述

    错误边界 错误边界 Error boundary 用来捕获后代组件错误 渲染出备用页面 注意 只在生产环境 项目上线 起效 特点 只能捕获后代组件生命周期产生的错误 不能捕获自己组件产生的错误和其他组件在合成事件 定时器中产生的错误 简单理
  • DevOps是什么

    DevOps 英文Development和Operations的组合 是一组过程 方法与系统的统称 用于促进开发 应用程序 软件工程 技术运营和质量保障 QA 部门之间的沟通 协作与整合 它的出现是由于软件行业日益清晰地认识到 为了按时交付
  • JavaBean SpringBean是对象还是类

    JavaBean SpringBean是对象还是类 什么是JavaBean 什么是SpringBean 首先先说结论 Bean可以理解为对象 这几天在学习Spring源码的时候 观察到底层反复的对Bean的操作 于是就去网上搜索Bean到底
  • JAVA小程序微信支付

    微信支付有专门的文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 1 当时找的时候都是前台如何 后来才发现后台需要做的就是统一下单 一 先到微信下载两个证书
  • java实现冒泡排序,直接插入排序,选择排序,希尔排序,以及求出它们的时间复杂度O(n)

    package com yg sort author GeQiLin date 2020 2 25 16 53 import java util Arrays public class Sort1 private static int ma
  • ModuleNotFoundError: No module named 'tqdm'

    bogon faceswap master macname pip3 install tqdm Collecting tqdm Downloading https files pythonhosted org packages 9f 3d
  • 软件版本(release、stable、lastest)的区别

    snapshot 快照 也即开发版 我们创建maven项目时 编辑器会自动给我们填入 1 0 SNAPSHOT版本 也就是1 0开发版 这个版本不能使用 因为该版本处于开发的过程 所以运行时会不时地更新 导致功能变化 正式环境中不得使用sn
  • layer.js open 隐藏滚动条

    img echart trand click function var host this data host var role this data role console log host host console log window
  • 华为防火墙NAT

    目录 NAT分类 黑洞路由 Server map 表 NAT分类 在内外网的边界 流量有出 入两个方向 所以NAT技术包含源地址转换和目的地址转换 一般情况下 源地址转换主要解决内部局域网计算机访问internet的场景 而目标地址转换主要
  • Qt/C++项目架构经验总结

    一 通用规则 除了极小的微型demo级别项目外 其余项目建议用pri分门别类不同文件夹存放代码文件 方便统一管理和查找 同类型功能的类建议统一放在一起 如果该目录下代码文件数量过多 也建议拆分多个目录存放 比如就3 5个界面的项目 统一搞个
  • Android 编码规范

    文章目录 背景 制定规范 一 开发环境 二 命名规范 1 资源命名 2 包命名 3 方法命名 4 类命名 5 变量 6 常量 二 编码规范 三 注释规范 1 类注释 2 方法注释 2 变量注释 3 区块注释 四 代码提交规范 五 其他须遵循