Android开发规范

Posted by JackPeng on August 10, 2015

Google官方Java代码风格参考规范链接, 中文翻译参考版链接

命名规范

1. 包命名

规则:包名全部小写,才用反域名命名规则,一级包名是顶级域名,通常为com, edu, gov, net, org等,二级包名,通过为公司名或部门名或者个人名,三级包名通常为项目名,四级包名为模块名或者层级名。以下是从层级包名来划分android项目中采用的包划分结构

com.domain.xxx.activity  //用户界面中所有的Activity类
com.domain.xxx.fragment  //界面中所有的Fragment类
com.domain.xxx.adapter   //界面中所有的Adapter类(适配器类)
com.domain.xxx.view      //自定义的View类
com.domain.xxx.service   //后台Service类
com.domain.xxx.util      //项目中常用的公共工具类(网络, IO, 日志等)
com.domain.xxx.bean      //实体模型类
com.domain.xxx.db        //数据库操作相关的类
com.domain.xxx.config    //所有的配置相关的类
com.domain.xxx.api       //网络api接口相关de 类

2. 类命名

规则:采用大驼峰式命名法,首字母大写,尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称包含单词缩写,则单词缩写的每个字母均应大写。以下列举的是android中几种最为常用的类的命名。

class LoginActivity;     //activity类
class DiscoverFragment;  //fragment类
class AnalysisService;   //service类
class WakeupRankAdapter; //adapter类
class StringUtils;       //工具类
class UserBean;          //模型类
class ApiImpl;           //接口实现类

3. 接口命名

规则:命名规则与类命名一样采用大驼峰式命名法,首字母大写,多以able, ible, er结尾

interface Comparable;  
interface Accessible;
interface OnClickListener;

4. 方法

规则:采用小驼峰命名法,首字母小写,方法名采用动词或动名词结构。方法的命名应该与方法的真正行为具有对应关系,下面给出一些方法名的动词前缀标示的建议。

方法名 描述
getXX() 获取某个属性的返回值
setXX() 设置某个属性值
initXX() 初始化方法,如初始化布局initView()
isXX() 判断是否true的方法;
checkXX() 与isXX意义等价
processXX() 处理数据
updateXX() 更新数据
saveXX() 保存数据
addXX() 添加数据
deleteXX() 删除数据
resetXX() 重置数据
clearXX() 清除数据
removeXX() 移除数据或者视图等,如removeView();
drawXX() 绘制数据或者视图

5. 变量

规则:采用小驼峰命名法,首字母小写。变量名应简短且能描述其用途,尽量避免拼音,无意义地缩写。除非是临时变量,否则不建议使用单个字符的变量名,如i, j, k。对于变量命名,还有一种风格是google的以字母m为前缀(m为member缩写),在android 源码中随处可见。

private int userName;  //java的一般性风格
private int mUserName; //google的成员变量风格,m为member的缩写

6. 常量

规则:常量使用全大写字母加下划线的方式命名。

public static final int TAG= "tag";
public static final int START_CLASS_NOT_FOUND = -2;

下面介绍的与android关系更加紧密:

7. 控件变量名

规则:首先需要满足第5条变量的规则, 模式:逻辑名 + view缩写

Button sendNewsBtn;
TextView passwordTxt;

8. 控件ID

规则:view缩写_模块名_逻辑名

android:id="@+id/btn_news_send"  //样例

view缩写如下:

View 缩写
TextView txt
EditText edit
Button btn
ImageButton ibtn
ImageView img
ListView lv
RadioGroup rgroup
RadioButton rbtn
ProgressBar rbar
SeekBar seek
CheckBox cb
Spinner spinner
TableLayout table
TableRow row
LinearLayout ll
RelativeLayout rl
ScrollView scroll
SearchView search
TabHost thost
TabWidget twidget

9. 资源文件名

9.1 layout的文件命名

规则:全部小写,采用下划线命名法。layout文件命名:组件类型_{模块_}功能.xml

activity_news_title.xml //样例
命名规范 组件类型
activity_{模块_}功能 Activity命名格式
fragment_{模块_}功能 Fragment命名格式
dialog_{模块_}功能 Dialog命名格式
popup_{模块_}功能 PopupWindow命名格式
item_list_{模块_}功能 ListView的item命名格式
item_grid_{模块_}功能 GridView的item命名格式

9.2 drawable的文件命名

模式:前缀{_控件}{_范围}{_后缀},控件、范围、后缀可选

bg_login_pressed.png //样例
drawable 命名细则
图标类 添加ic前缀
背景类 添加bg前缀
分隔类 添加div前缀
默认类 添加def前缀
区分状态时,默认状态 添加normal后缀
区分状态时,按下时的状态 添加pressed后缀
区分状态时,选中时的状态 添加selected后缀
区分状态时,不可用时的状态 添加disable后缀
多种状态的 添加selector后缀

9.3 动画的文件命名

规则:{范围_}动画类型_动画方向。

login_fade_in.xml //样例
动画命名 描述
fade_in 淡入
fade_out 淡出
push_down_in 从下方推入
push_down_out 从下方推出
slide_in_from_top 从头部滑动进入
zoom_enter 变形进入
shrink_to_middle 中间缩小

10. 资源内的name命名

10.1 strings.xml

模式:activity名_{范围_}逻辑名

<string name="login_username">用户名</string> //样例

10.2 colors.xml

模式:前缀{_控件}{_范围}{_后缀}, 控件、范围、后缀可选,

<color name="bg_login">#FFFFFF</color> //样例
colors 命名细则
背景颜色 添加bg前缀
文本颜色 添加text前缀
分割线颜色 添加div前缀
区分状态时,默认状态的颜色 添加normal后缀
区分状态时,按下时的颜色 添加pressed后缀
区分状态时,选中时的颜色 添加selected后缀
区分状态时,不可用时的颜色 添加disable后缀

代码风格

原则

  • 不要直接忽略Exceptions

    例如下面的示例,永远不要这样做,无法预测未来可能的变化

      void setServerPort(String value) {  
          try {  
              serverPort = Integer.parseInt(value);  
          } catch (NumberFormatException e) { }  
      }  
    

    正确的做法应该如下:

      void setServerPort(String value) throws ConfigurationException {
          try {
              serverPort = Integer.parseInt(value);
          } catch (NumberFormatException e) {
              throw new ConfigurationException("Port " + value + " is not valid.");
          }
      }
    
  • import采用完全限定名

    不提倡:

      import foo.*;   
    

    正确做法:

      import foo.Bar;  
    
  • 括号风格:

    不提倡:

      if (condition)
          body(); 
    

    正确做法:

      if (condition) {
          body(); 
      }
    
  • 使用空格来缩进

    使用4个空格缩进来代表块,而绝不使用tab键;
    使用8个空格来代表行包裹,包括函数调用。

注释

  • 1.类注释 每个类完成后应该有作者姓名和联系方式的注释,对自己的代码负责

    /**

    • 作者: yuanhh
    • 时间: 13-12-20 19:25
    • 描述: 用户登录
    • 联系方式: yuanhuihui208@163.com */ public class Login{ … }
  • 2.方法注释 每一个成员方法(包括自定义成员方法、覆盖方法、属性方法)的方法头都必须做方法头注释

    /*

    • 方法名:
    • 功 能:
    • 参 数:
    • 返回值:无 */
  • 3.快注释

    private class MessageObserver extends ContentObserver { public MessageObserver() { super(mainHandler); }

      public void onChange(boolean hasChanged) {
       // 发送更新UI的消息
       mHandler.sendMessage(mHandler.obtainMessage(0x2));
      }   }
    
  • 4.资源文件注释

    #FF0000

    #0079FF