Android 开发规范

  • Java类

    • 类名:大驼峰命名,所有单词首写字母大写,并且类名最好为名词.

      • 正确
      public class People{
      }
      public class School{
      }
      public class SchoolModel{
      }
      
      • 错误
      people,school,schoolmodel
      
      • 常用类命名
        • activity类,以Activity为后缀
        • fragment类,以Fragment为后缀
        • service类,以Service后缀
        • adapter类,以Adapter为后缀
        • 工具类,以Util为后缀
        • 实体类,命名以实际含义
        • 接口,以I为前缀(后续补充callback等命名)
    • 包名:全部单词小写用"."连接单词,不使⽤用下划线链接,

      • 正确:
      com.login.login,
      com.login.password
      
      • 错误
      com_login_login
      com_login_password
      
    • 局部变量:采用小驼峰,第一个单词手写字母小写后面单词首写字母都大写

      • 正确
      People people=new People();
      Man man=new Man();
      
      • 错误
      People People=new People();
      Man Man=new Man();
      
    • 全局变量:依然采用小驼峰命名,但是有些小的区别,第一个字母必须为小写m后面加相应的单词(依据Android源码编写)

      • 正确
      public People mPeople;
      public Man mMan;
      
      • 错误
      public People people;
      public Man Man;
      
      • PS:实体类中的成员变量不做m+限制,采用小驼峰命名规范,单词拼接使用"_",如:

        public String year;
        public String name_count;
        public String school;
        

      后续补充全局boolean变量的命名
      - 常量命名:单词所有字母大写,并用下划线拼接单词,
      - 正确

        ````
        public static final String CONSTANT_CASE="constant_case";
        public static final int COUNTRY_CHINA=124;
        ````
      
      • 错误

        public static final String CONSTANT_case="constant_case";
        public static final int COUNTRY_china=124;
        
      • 常用常量定义规范:

        • intent filter相关常量
          - action:INTENT_ACTION_功能
          - category:INTENT_CATEGORY_功能
          - 字符串定义规范:"包名+功能(大驼峰)",如:"com.example.action.TIMETRAVEL"

        • 组件之间数据传递的键值

          • EXTRA_功能,确保将应用的软件包名称作为前缀,如:
          public static final String EXTRA_GIGAWATTS ="com.example.EXTRA_GIGAWATTS";
          
      • 用于startActivityForResult()和setResult的code常量:
        - REQUEST_CODE_功能
        - RESULT_CODE_功能

        • 常量位置定义规则:
          - 只限于当前类使用的常量,定义在当前类即可
          - 公共常量放在公共常量类
    • 方法命名:小驼峰,且尽量动词开头

      • 正确
      public void login();
      public void getHome();
      public void isLogin();
      
      • 错误
      public void Login();
      public void GetHome();
      
      • 常用方法命名
        • 初始化方法,命名以init开头,如initView()
        • 按钮点击方法
        • 设置方法,以set开头,如setData()
        • 具有返回值的获取方法,以get开头,如getData();
        • 通过异步加载数据的方法,以laod开头,如loadData();
        • 布尔的判断,命名以is或has开头,如isCheck();
    • 方法参数命名:小驼峰命名,如

      public void login(String username,String password);
      public void isLogin(String loginName);
      
    • 命名规则:

      • 控件命名:

        • 全局:m+功能+View
        • 局部:功能+View;
        • 如:
        public Button mLoginView;
        public LinearLayout mLoginContainView;
        
        • ps:不采用:m+功能名+控件缩写,功能+控件缩写,的原因主要考虑很多控件缩写重复,并且每添加一个自定义控件就需要定义一个控件缩写很痛苦。特别是当一个控件为Button loginBtn ,当需求变更需要使用TextView,很多时候会忘修改修改缩写。
      • 其他对象命名按照:全局变量和局部变量

  • Class 内部顺序和逻辑

    • 每个 class 都应该按照一定的逻辑结构来排列基成员变量、方法、内部类等,从而达到良好的可读性。

    • 总体上来说,要按照先 public, 后 protected, 最后 private, 函数的排布也应该有一个逻辑的先后顺序,由重到轻。

    • 以下顺序可供参考:

      • 定义TAG,一般为 private(可选)
      • 定义 public 常量
      • 定义 protected 常量、内部类
      • 定义 private 变量
      • 定义 public 方法
      • 定义 protected 方法
      • 定义 private 方法
    • 资源文件命名:

    • 图片命名: 单词全部小写,用""拼接,命名规则:前缀名名字,前缀名名字状态(后缀) 且图片统一放在mipmap相对应的位置,

      • 如:

        bg_main.png、ic_search_press.png
        
      • 前缀,后缀表格

前缀 说明
ic icon 主要用于布局和子布局的图标
bg background 主要用于布局和子布局的背景
div divider 主要用于分隔线,不仅包括Listview中的还包括普通布局中的线
后缀 说明
不加 图片的状态,代表普通状态
pressed 图片的状态,代表按下状态
selected 图片的状态,代表其所占的view被选中
disable 图片的状态,代表其所占的view没有被选中
  • 布局文件命名:单词全部小写,采用"_"拼接,

    Activity 的 layout 以 module_activity 开头
    Fragment 的 layout 以 module_fragment 开头
    Dialog 的 layout 以 module_dialog 开头
    include 的 layout 以 module_include 开头
    ListView 的行 layout 以 module_list_item 开头
    RecyclerView 的 item layout 以 module_recycle_item 开头
    GridView 的行 layout 以 module_grid_item 开头
    PopupWindow的layout以module_ppw开头
    include的layout以module_include开头
    stubview的layout以module_stubview开头
    merge的layout以module_merge开头
    menu的layout以module_menu开头

  • 控件id命名:module_功能,

id=login_cancel
  • string资源文件命名:不要跟title、dialog、button等东西关系起来,全部写入 module_strings.xml 文件中, 字符串以小写单词+下划线的方式命名,采用以下规则:
模块名_逻辑名称
如:moudule_login_tips,module_homepage_notice_desc
  • colors资源使用#AARRGGBB 格式写入 module_colors.xml 文件中命名规则:
模块名_逻辑名称_颜色
<color name="module_btn_bg_color">#33b5e5e5</color>
  • style 资源采用小写单词+下划线方式命名,写入 module_styles.xml 文件中, 采用以下规则:
父 style 名称.当前 style 名称
<style name="ParentTheme.ThisActivityTheme"> 
...
</style>
  • themes.xml
    - 命名:大驼峰,首单词字母大写,也可以用"."拼接,如以下两种写法都是规范的

     ````
     <style name="BaseActionBarTheme" parent="ThemeOverlay.AppCompat.ActionBar" />
     <!-- app 通用actionbar主题-->
     <style name="AppActionBarTheme" parent="BaseActionBarTheme">
         <item name="actionMenuTextAppearance">@style/ActionMenuText</item>
         <item name="actionMenuTextColor">@color/colorPrimaryText</item>
     </style>
     ````
    
  • dimen 资源以小写单词+下划线方式命名,写入 module_dimens.xml 文件中, 采用以下规则:

模块名_描述信息
<dimen name="module_horizontal_line_height">1dp</dimen>
  • anim 资源名称,命名规则:
模块名_逻辑名称_[方向|序号]
tween 动画资源:尽可能以通用的动画名称命名,如 module_fade_in ,
 module_fade_out , module_push_down_in (动画+方向);
frame 动画资源:尽可能以模 块+功能命名+序号。如:module_loading_grey_001
  • xml文件下
    • perference配置文件,功能_preferences.xml
  • drawable资源名称:
模块名_业务功能描述_控件描述_控件状态限定词
如:module_login_btn_pressed,module_tabs_icon_home_normal
  • 细节规范
    • 文件编码:源文件编码格式为UTF-8。

    • import不要使用通配符, 即,不要出现类似这样的import语句:import java.util.*;

    • 重载:永不分离当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。

    • 判断语句:

      • if, else, for, do, while语句一定要附带大括号如:
      if(XXX){
      
      }else{
      
      }
      
      • 错误示例:
      If
      xxxx
      Else
      xxxx
      
- 每次只声明一个变量,不要使用组合声明,比如

````
错误  int year, name;
正确 int year;
    int name;
````

- switch块内 default的情况要写出来,每个switch语句都包含一个default语句组,即使它什么代码也不包含。
  • 方法参数个数最多7个(构造函数尽量限制7个或者使用Builder模式)
  • 待讨论
    • 一行代码或者注释限制为80到100字符,任何一行如果超过这个字符数限制,必须自动换行
    • 一个方法不能超过一屏,超过一屏则分解为多个方法
  • 注释规范

    • 类注释:每个类必须说明这个类是做什么的,不用写作者名(让每个人都可以修改这个类,避免添加其他人添加功能找原作者)

          /**
          * to do something?
          */
      public class AppActivity extends BaseActivity {}
      
    • 方法注释:

      /**
       * 
       *@param key  键值
       *@param mObject  对象
       *@return  返回值
       */
      public String getName(String key,Object object){}
      
    • 常量注释:

      /**
       * inten跳转指定值
       */
      public static final int INTENT_APP=1001;
      
    • 实参注释(视具体情况添加)

      getName(key/*实参注释*/)
      
  • 接口定义方法,每个方法必须加注释

    • 注意事项注释
      - TODO 使用TODO来标记代码,说明标识处有功能代码待编写
      - FIXME 使用FIXME来标记代码,说明标识处代码需要修正,甚至代码是 错误的,不能工作,需要修复
      - XXX 使用XXX来标记代码,说明标识处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进
  • 参考资料

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

推荐阅读更多精彩内容

  • 请看完结版:Android开发规范(完结版)
    Blankj阅读 8,593评论 25 115
  • 个人总结的 Android 开发规范,其中控件缩写及 Android 资源文件命名部分不是很确定,有待商榷。Jav...
    牙锅子阅读 1,558评论 0 6
  • title: Android开发规范 摘要 1 前言 2 命名规范 3 资源文件规范 4 版本统一规范 5 第三方...
    大白栈阅读 1,186评论 0 16
  • 包名全部采用小写,不用下划线区分单词 主包名采用[公司性质].[公司名称].[项目名称]的命名方式 例如:翡翠教育...
    gyymz1993阅读 3,117评论 1 29
  • 饭后和安乔童学习一下,然后就开始各自画画,都是什么花呢?
    Loura明珠阅读 213评论 0 0