Android开发规范文档

包名全部采用小写,不用下划线区分单词
主包名采用[公司性质].[公司名称].[项目名称]的命名方式
  • 例如:翡翠教育做的手机助手包名edu.feicui.assistant
通用功能子包名采用[主包名].[通用名称]的命名方式

Android中常见命名规则

包名

包名全部小写,连续的单词只是简单地连接起来,不使用下划线。
采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为xx(可以是公司或则个人的随便),三级包名根据应用进行命名,四级包名为模块名或层级名。

包名 此包中包含
com.xx.应用名称缩写.main 页面用到的Activity类 (activitie层级名用户界面层)
com.xx.应用名称缩写.activity 页面用到的Activity类 (activitie层级名用户界面层)
com.xx.应用名称缩写.base 基础共享的类
com.xx.应用名称缩写.adapter 页面用到的Adapter类 (适配器的类)
com.xx.应用名称缩写.util 此包中包含:公共工具方法类(util模块名)
com.xx.应用名称缩写.bean 下面可分:vo、po、dto 此包中包含:JavaBean类
com.xx.应用名称缩写.model 此包中包含:模型类
com.xx.应用名称缩写.db 数据库操作类
com.xx.应用名称缩写.view(或者 com.xx.应用名称缩写.widget ) 自定义的View类等
com.xx.应用名称缩写.service Service服务
com.xx.应用名称缩写.receiver BroadcastReceiver服务
com.xx.应用名称缩写.prwd 首选项
com.xx.应用名称缩写.provider 内容提供者

类名

类名都以UpperCamelCase风格编写。
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。
名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

描述 例如
Activity 类 Activity为后缀标识 欢迎页面类WelcomeActivity
Adapter类 Adapter 为后缀标识 新闻详情适配器 NewDetailAdapter
解析类 Parser为后缀标识 首页解析类HomePosterParser
工具方法类 Util或Manager为后缀标识(与系统或第三方的Utils区分)或功能+Util 线程池管理类:ThreadPoolManager日志工具类:LogUtil(Logger也可)打印工具类:PrinterUtil
数据库类 以DBHelper后缀标识 新闻数据库:NewDBHelper
Service类 以Service为后缀标识 时间服务TimeServiceBroadcast
Receiver类 以Receiver为后缀标识 推送接收JPushReceiver
ContentProvider 以Provider为后缀标识 1
自定义的共享基础类 以Base开头 BaseActivity,BaseFragment

方法名

方法名都以 LowerCamelCase 风格编写。
方法名通常是动词或动词短语。

方法 说明
initXX() 初始化相关方法,使用init为前缀标识,如初始化布局initView()
isXX() checkXX() 方法返回值为boolean型的请使用is或check为前缀标识
getXX() 返回某个值的方法,使用get为前缀标识
handleXX() 对数据进行处理的方法,尽量使用handle为前缀标识
displayXX()/showXX() 弹出提示框和提示信息,使用display/show为前缀标识
saveXX() 与保存数据相关的,使用save为前缀标识
resetXX() 对数据重组的,使用reset前缀标识
clearXX() 清除数据相关的
removeXXX() 清除数据相关的
drawXXX() 绘制数据或效果相关的,使用draw前缀标识
量词列表 量词后缀说明
First 一组变量中的第一个
Last 一组变量中的最后一个
Next 一组变量中的下一个变量
Prev 一组变量中的上一个
Cur 一组变量中的当前变量。

资源文件命名规范

资源布局文件(XML文件(layout布局文件)):
全部小写,采用下划线命名法
contentview 命名
必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
所有Activity或Fragment的contentView必须与其类名对应,对应规则为:
将所有字母都转为小写,将类型和功能调换(也就是后缀变前缀)。

名称 描述 命名
Dialog dialog_描述.xml dialog_hint.xml
PopupWindow ppw_描述.xml ppw_info.xml
列表项 item_描述.xml item_city.xml
包含项 模块_(位置)描述.xml activity_main_head.xml、activity_main_bottom.xml

UI控件缩写表

控件 缩写 例子
LinearLayout ll llFriend或者mFriendLL
RelativeLayout rl rlMessage或mMessageRL
FrameLayout fl flCart或mCartFL
TableLayout tl tlTab或mTabTL
Button btn btnHome或mHomeBtn
ImageButton ibtn btnPlay或mPlayIBtn
TextView tv tvName或mNameTV
EditText et etName或mNameET
ListView lv lvCart或mCartLV
ImageView iv ivHead或mHeadIV
GridView gv gvPhoto或mPhotoGV

资源文件(图片drawable文件夹下):

全部小写,采用下划线命名法,加前缀区分
命名模式:可加后缀 small 表示小图, big 表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
用途
模块名
逻辑名称
用途模块名颜色
用途逻辑名称
用途
颜色
说明:用途也指控件类型(具体见UI控件缩写表)

名称 命名
btn_main_home.png 按键
divider_maket_white.png 分割线
ic_edit.png 图标
bg_main.png 背景
btn_red.png 红色按键
btn_red_big.png 红色大按键
ic_head_small.png 小头像
bg_input.png 输入框背景
divider_white.png 白色分割线

如果有多种形态如按钮等除外如 btn_xx.xml(selector)

功能 命名
按钮图片使用btn_正常情况效果 btn_xx_normal
按钮图片使用btn_点击时候效果 btn_xx_pressed
state_focused聚焦效果 btn_xx_focused
state_enabled (false)不可用效果 btn_xx_disabled
state_checked选中效果 btn_xx_checked
state_selected选中效果 btn_xx_selected
state_hovered悬停效果 btn_xx_hovered
state_checkable可选效果 btn_xx_checkable
state_activated激活的 btn_xx_activated
state_window_focused btn_xx_windowfocused
背景图片使用bg_功能_说明 bg_head
默认图片使用def_功能_说明 def_search_cell
图标图片使用ic_功能_说明 ic_more_help
具有分隔特征的图片使用seg_功能_说明 seg_list_line
选择图标使用sel_功能_说明 sel_ok

常见的英文单词缩写:

名称 缩写
icon ic (主要用在app的图标)
color cl(主要用于颜色值)
divider di(主要用于分隔线,不仅包括Listview中的divider,还包括普通布局中的线)
selector sl(主要用于某一view多种状态,不仅包括Listview中的selector,还包括按钮的selector)
average avg
background bg(主要用于布局和子布局的背景)
buffer buf
control ctrl
delete del
document doc
error err
escape esc
increment inc
infomation info
initial init
image img
length len
library lib
message msg
password pwd
position pos
server srv
string str
temp tmp
window wnd(win)
一般功能子包名采用[主包名].[模块名称].[子模块名称]的命名方式。
  • 例如:手机助手的闹钟模块包名 edu.feicui.assistant.alarm
只需导入用到的类,不得用*导入包下所有类
导入类时,系统类在上方,自定义类在下方

1 代码主要采用大/小驼峰命名法,即除首字母外,每个单词首字母大写,整体首字母大小根据其它规范决定

2 类名、接口名、枚举名等首字母大写,若由多个单词组成,则其后每个单词首字母大写,例如:
class ConfigManager{}

3 类名、接口名、枚举名等首字母大写,若由多个单词组成,则其后每个单词首字母大写,例如:
class ConfigManager{}

4 继承自安卓组件的类,采用父类名作为后缀,例如:
class LoginActivity extends Activity{}

5 自定义异常必须以Exception结尾

6 除for循环变量外,一律不得使用i、j、k等单字符作为变量名

7 定义数组时方括号紧随在原始类型之后,数组名称一般使用复数形式,

  • 例如:int[] arrays;

8 常量、枚举等均采用大写形式,用下划线区分各单词,

  • 例如:final static int DIALOG_ID_ALARM = 1;
    enum Season{SPRING, SUMMER, AUTUMN, WINTER};

9 全局变量添加所有者前缀:实例成员变量前缀m(表示member),类静态变量前缀s(表示static),

  • 例如:实例变量mRun
    类静态变量sInstance

10 控件变量添加组件前缀,顺序在所有者前缀之后,

  • 例如:全局名称mBtnNext
    局部名称btnNext
常见控件前缀如下表:
Paste_Image.png
Paste_Image.png

11 除单例模式外一般不得使用静态变量

12 常量一般使用final static修饰,根据需要使用可见性修饰符,例如:
public static final int VISIBLE = 0x00000000;

13 一般方法名首字母小写,若由多个单词组成,则其后每个单词首字母大写

14 构造方法采用递增方式(参数多的写在后面)

  • 例如:
  public GameView(Context context) {
      this(context, null);
  }
  public GameView(Context context, AttributeSet attrs) {
      this(context, attrs, 0);
  }
  public GameView(Context context, AttributeSet attrs, int defStyle) {}

15 仅在项目内使用的实体类不使用JavaBean进行封装,直接将成员变量访问修饰符修改为非private,例如:
class User{public String name,pwd;}

16 实体类中固定值的成员变量可设置成final,并通过构造函数初始化

17 实体类中不得随意修改的成员变量可添加下划线前缀以作区别,例如:
class User{public int _id;}

18 一般不使用System.out输出,而是使用Log中的方法

19 使用BuildConfig.DEBUG标记对Log进行封装,只在调试时输出重要信息,正式版不输出

20 一般try……catch只捕获需要的异常,catch块不得为空,至少应当将异常信息输出

21 资源命名全部采用小写,各单词间以下划线区分

22 布局文件采用[前缀]_[功能模块].xml的命名方式,

  • 例如:
    MainActivity的布局activity_main.xml]
常见前缀如下表:
Paste_Image.png

23 图片采用[性质前缀][功能模块] [属性后缀].[扩展名]的方式,

  • 例如:
    主背景图片bg_main.png
    确定按钮按下btn_ok_presssed.png
常见属性后缀如下表:
Paste_Image.png
values目录下文件名称较固定,不得随意更改,常见名称如下:
Paste_Image.png

1开源项目必须添加文件注释,非开源项目建议添加,例如:

/*
  * @(#): Document.java
  * @project:IndentObjectNatation
  * @version: v1.1
  * @copyright: Copyright (C) 2013-2014 The Emerald Education
  * @description: 
  *         This file is a part of Indent Object Notation project.
  * 
  * @modify:
  * ---- No.1 Modified By Mr. Tang At 2014-05-06 11:32 Based On 1.0 ----
  *      Create this file.
  * ---- No.2 Modified By Mr. Zhang At 2014-05-06 11:32 Based On 1.0 ----
  *      Make the class Document extend from the class Node.
  */

2类定义一般需要写类注释,接口一般需要写接口注释,如果没有文件注释,则需要在类注释和接口注释中标出作者,例如:

/**
  * Root of the ION tree, provides the access to the   document's data.
  * <p>
  * Subclass of {@link Node}, Since elements, comments, etc. cannot exist
  * outside the context of a Document, the Document also contains the
  * factory methods needed to create these objects.
  * </p>
  * 
  * @author Mr. Zhang
  */
  class Document {}

3成员变量、静态变量、常量等添加属性注释,例如:

 /** This view is invisible. */
 public static final int INVISIBLE = 0x00000004;

4关联性较大的多个成员变量等可以共用同一条注释,例如:

/** The width and height of View. */
 private int mWidth, mHeight;

5public和protected方法必须添加方法注释,default和private方法建议添加方法注释,例如:

 /**
  * Writes {@code count} characters starting at {@code offset}     in {@code buf}
  * to the target.
  *
  * @param buf
  *            the non-null character array to write.
  * @param offset
  *            the index of the first character in {@code buf} to write.
  * @param count
  *            the maximum number of characters to write.
  * @return {@code true} if success, otherwise {@code false}
  * @throws IndexOutOfBoundsException
  *             if {@code offset < 0} or {@code count < 0}, or if {@code
  *             offset + count} is greater than the size of {@code buf}.
  * @throws IOException
  *             if this writer is closed or another I/O error occurs.
  */
   public abstract boolean write(char[] buf, int offset, int count) throws IndexOutOfBoundsException, IOException;

6若覆盖基类的方法,则可以不写方法注释,但必须用@Override标出,例如:

 @Override
 protected void onCreate(Bundle savedInstanceState) {}

7不建议继续使用的方法用@Deprecated标出

8switch……case的每个条件一般添加简短说明,例如:

 switch (type) {
 case 1:// Android apps
       break;
 case 2:// Android games
       break;
 case 3:// iOS apps
       break;
 default:// Not a valid package
       break;
 }

9 如果if的条件大于2个,则必须写注释,例如:

 if (isBluetooth // If Bluetooth network is on
             || isWifi // If WLAN network is on
             || is3g // if 3g network is on
   ) {}

10 对于未完成的方法,使用TODO加以标记,例如:

void write(byte[] buf, File file) {
  // TODO: Write buf to file
}

11 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记,例如:

void parseXML(File file) {
     // XXX: Maybe SAX is better
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
     Document doc = builder.parse(file);
 }

12 若代码存在严重问题或仅用于调试,使用FIXME加以标记(注:存在FIXME标记的代码不能作为正式版发布)

boolean login(String name, String pwd) {
      //FIXME: Remove this line before publishing
      System.out.println("name=" + name + ", password=" + pwd);
      if (users.containsKey(name) && users.get(name).equals(pwd))
      return true;
      return false;
 }

13 如果for、while等代码块过长,可以在结尾处标记循环变量,例如:

for (int position = 0; position < 10; position++) {
        ……
}// end for: position
while(mRun){
        ……
}// end while: mRun
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • Android编码规范 源文件基础 文件名 源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。 文...
    呼呼哥阅读 928评论 0 0
  • 请看完结版:Android开发规范(完结版)
    Blankj阅读 8,592评论 25 115
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 40,913评论 0 48
  • 作者:李旺成 时间:2016年4月3日 1. 前言 这份文档参考了 Google Java 编程风格规范和 Goo...
    diygreen阅读 39,830评论 19 224