旗鱼移动Android开发规范

 

旗鱼移动Android开发规范

撰写:     旗鱼移动Android开发组     

 

 

 

 

 

 

 

旗鱼移动科技有限公司所属,未经允许不得私自传播

 

 

 

 

                                                      第1版

2016年 5 月 3 日

 

 


 

 

 

 

目录

 

一、Android开发框架

二、命名规范

  2.1 包(packages)命名规范

  2.2 类(classes)命名规范

  2.3 方法methods)

  2.4 变量(variables)

  2.5 常量(Constants)

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

  2.7 资源布局文件(XML文件(layout布局文件))

  2.8 资源布局文件layout中的id命名

三、代码规范

  3.1 排版

  3.2 注释

四、XML规范

 

 



一、Android开发框架

  旗鱼移动Android开发项目统一采用公司Android开发框架。

二、命名规范

2.1 包(packages)命名规范

  采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为qiyu,三级包名根据应用进行命名,四级包名为模块名或层级名等。

包名

此包中包含

com.qiyu.应用名称缩写.ui.activity

页面用到的Activity类 (activities层级名用户界面层)

com.qiyu.应用名称缩写.ui.fragment

页面用到的Fragment

com.qiyu.应用名称缩写.adapter

页面用到的Adapter类 (适配器的类)

com.qiyu.应用名称缩写.utils/tools

此包中包含:公共工具方法类(utils/tools模块名)

com.qiyu.应用名称缩写.response.data

网络请求返回response层级1

com.qiyu.应用名称缩写.response.bean

网络请求返回response层级2

com.qiyu.应用名称缩写.response.entity

网络请求返回response层级3

com.qiyu.应用名称缩写.bean/entity

此包中包含:元素类

com.qiyu.应用名称缩写.db

数据库操作类

com.qiyu.应用名称缩写.view

自定义的View类等

com.qiyu.应用名称缩写.XXXX

其他定义的包名

 

 

2.2 类(classes命名规范

  采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的,  比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

 

描述

Activity 类

Activity为后缀标识

欢迎页面类WelcomeActivity

Adapter类

Adapte 为后缀标识

新闻详情适配器NewDetailAdapter

解析类

Data整体后缀标识二层析类Bean为后缀标识,三层为Entity。

首页解析类HomePosterData

公共方法类

Utils、Tools或Manager为后缀标识灵活运用

线程池管理类:ThreadPoolManager 

日志工具类:旗鱼点餐中为L

Service类

以Service为后缀标识

时间服务TimeService

BroadcastReceive类

以Receiver为后缀标识

时间通知TimeReceiver

ContentProvider

以Provider为后缀标识

时间共享TimeProvider

直接写的共享基础类

以Base开头

BaseActivity,BaseFragment

............

............

.............

 

2.3 方法methods)

  动词或动名词,采用小驼峰命名法例如:onCreate(),run()自定义方法定义为private ,特别需要例外。

方法

说明

initXX()

初始化相关方法,使用init为前缀标识,如初始化布局initView()

isXX()

checkXX()方法返回值为boolean型的请使用is或check为前缀标识有时必须以get开头,如数据库类里。

getXX()

返回某个值的方法,使用get为前缀标识

processXX()

对数据进行处理的方法,尽量使用process为前缀标识

displayXX()

弹出提示框和提示信息,使用display为前缀标识

saveXX()

与保存数据相关的,使用save前缀标识

resetXX()

对数据重组的,使用reset前缀标识

clearXX()

清除数据相关的

removeXXX()

清除数据相关的

drawXXX()

绘制数据或效果相关的,使用draw前缀标识

initXX()

初始化相关方法,使用init为前缀标识,如初始化布局initView()

..........

.....................

 

 

2.4 变量(variables)

  采用小驼峰命名法。类中控件名称必须与xml布局id保持一致。

  用统一的量词通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。
量词列表:量词后缀说明
First   一组变量中的第一个
Last   一组变量中的最后一个
Next  一组变量中的下一个变量
Pre   一组变量中的上一个
Cur   一组变量中的当前变量

......   .................

2.5 常量(Constants)

  全部大写,采用下划线命名法.例如:MIN_WIDTH

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

  全部小写,采用下划线命名法,加前缀区分图片命名遵守图片命名规范,如有多种形态如按钮,则命名方式如 bt_功能名_xx.selector(操作).xml等

图片文件名后缀

状态说明

_normal

(default state)

_pressed

state_pressed

_focused

state_focused

_disabled

state_enabled (false)

_checked

state_checked

_selected

state_selected

_hovered

state_hovered

_checkable

state_checkable

_activated

state_activated

_windowfocused

state_window_focused

2.7 资源布局文件(XML文件(layout布局文件))

  全部小写,采用下划线命名法

模块

命名规则

示例

Activity

activity_功能模块_xx.xml

activity_main.xmlactivity_order_detail.xml

Fragment

fragment_功能模块_xx.xml

fragment_head.xml

Dialog

dialog_描述_xx.xml

dialog_hint.xml

PopupWindow

ppw_描述_xx.xml

ppw_info.xml

包含项include

include_模块_xx.xml

include_head.xml

adapter的子布局

item_功能模块_xx.xml

item_main.xml

.........

...........

................

 

2.8 资源布局文件layout中的id命名

  命名模式为:view缩写_view的逻辑名称_XX。如tv_name,tv_name_label。

  View缩写使用view中每个大写字母组合拼成小写,如TextView写成tv即可。

  View的缩写详情示例如下:

控件

命名缩写示例

TextView

tv

EditText

et

ImageView

iv

Button

bt

LinearLayout

ll

RelativeLayout

rl

RecycleView

rv

.........

...........

 

三、代码规范

3.1 排版

3.1.1 程序块要采用缩进风格编写,缩进的空格数为4个。

  说明:对于由开发工具自动生成的代码可以有不一致。

3.1.2 编程语句长度设置成160个字符(非必须)。

3.1.3 不允许把多个短语句写在一行中,即一行只写一条语句。

  示例:如下例子不符合规范。

  rect.length = 0; rect.width = 0;

  应如下书写

rect.length = 0;
  rect.width = 0;

 

3.1.4 if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。

示例:如下例子不符合规范。
    if (pUserCR == NULL) return;


    应如下书写:
    if (pUserCR == NULL)
    {
       return;
    }

3.1.5 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格, case语句下的情况处理语句也要遵从语句缩进要求。

3.1.6 程序块的分界符(如大括号‘ {’和‘ }’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、 for、 do、 while、 switch、 case语句中的程序都要采用如上的缩进方式。

示例:如下例子不符合规范。


    for (...) {
       ... // program code
    }


    if (...)
      {
      ... // program code
      }

 

  void example_fun( void )
  {
  ... // program code
  }

 

应书写如下。

 

  for (...)
  {
    ... // program code
  }


  if (...)
  {
    ... // program code
  }


  void example_fun( void )
  {
    ... // program code
  }

 

3.1.7 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

  说明:采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的, 所以, 在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格, 多重括号间不必加空格,因为在 C/C++语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。

  示例:

  (1) 逗号、分号只在后面加空格。
   int a, b, c;

 

  (2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、 "%",逻辑操作符"&&"、"&",位域操作符"<<"、 "^"等双目操作符的前后加空格。
  if (current_time >= MAX_TIME_VALUE)
  a = b + c;
  a *= 2;
  a = b ^ 2;

 

  (3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
  flag = !isEmpty;   // 非操作"!"与内容之间
  p = &mem;     // 地址操作"&" 与内容之间
  i++;        // "++","--"与内容之间

 

(4) if、 for、 while、 switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显。
if (a >= b && c > d)

 

 

 

 

 

3.2 注释

3.2.1 一般情况下,源程序有效注释量必须在20%以上。

  说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

3.2.2 说明性文件(如.java文件)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

  示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。

  /*************************************************
  Copyright (C), 2015-2016nizwo Tech. Co., Ltd.
  File name: // 文件名
  Author: Version: Date: // 作者、版本及完成日期
  Description: // 用于详细说明此程序文件完成的主要功能,与其他模块
  // 或函数的接口,输出值、取值范围、含义及参数间的控
  // 制、顺序、独立或依赖等关系
  Others: // 其它内容的说明
  Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明
    1. ....
  History: // 修改历史记录列表,每条修改记录应包括修改日期、修改
     // 者及修改内容简述
  1. Date:
   Author:
      Modification:
  2. ...
  *************************************************/

 

  说明: Description 一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。 History 是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。

3.2.3 函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。

  示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。


  /*************************************************
  Function: // 函数名称
  Description: // 函数功能、性能等的描述
  Calls: // 被本函数调用的函数清单
  Called By: // 调用本函数的函数清单
  Table Accessed:// 被访问的表(此项仅对于牵扯到数据库操作的程序)
  Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
  Input: // 输入参数说明,包括每个参数的作用、取值说明及参// 数间关系。
  Output: // 对输出参数的说明。
  Return: // 函数返回值的说明
  Others: // 其它说明
  *************************************************/

3.2.4 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。

3.2.5 注释的内容要清楚、明了,含义准确,防止注释二义性。

  说明:错误的注释不但无益反而有害。

3.2.6 避免在注释中使用缩写,特别是非常用缩写。

  说明:在使用缩写时或之前,应对缩写进行必要的说明。

3.2.7 对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。

  说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。

3.2.8 避免在一行代码或表达式的中间插入注释。

  说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。

3.2.9 注释格式尽量统一,建议使用“ /* …… */”类或方法名注释使用/**.......*/

 

3.2.10 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

  示例:如下例子不符合规范。

  例 1:
  /* get replicate sub system index and net indicator */


  repssn_ind = ssn_data[index].repssn_index;
  repssn_ni = ssn_data[index].ni;


  例 2:
  repssn_ind = ssn_data[index].repssn_index;
  repssn_ni = ssn_data[index].ni;
  /* get replicate sub system index and net indicator */


  应如下书写
  /* get replicate sub system index and net indicator */
  repssn_ind = ssn_data[index].repssn_index;
  repssn_ni = ssn_data[index].ni;

 

3.2.11 将注释与其上面的代码用空行隔开。


  示例:如下例子,显得代码过于紧凑。
  /* code one comments */
  program code one
  /* code two comments */
  program code two


  应如下书写
  /* code one comments */
  program code one


  /* code two comments */
  program code two

3.2.12 注释与所描述内容进行同样的缩排。

  说明:可使程序排版整齐,并方便注释的阅读与理解。


  示例:如下例子,排版不整齐,阅读稍感不方便。

  void example_fun( void )
  {
  /* code one comments */
  CodeBlock One

/* code two comments */
  CodeBlock Two

   }

  应改为如下布局。

  void example_fun( void )
  {
    /* code one comments */
    CodeBlock One


    /* code two comments */
    CodeBlock Two
  }

3.2.13 在代码的功能、意图层次上进行注释,提供有用、额外的信息。

  说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。

  示例:如下注释意义不大。

  /* if receive_flag is TRUE */
  if (receive_flag)

  而如下的注释则给出了额外有用的信息。 
  /* if mtp receive a message from links */
  if (receive_flag)

 

 

 

3.3 变量、结构

3.3.1 去掉没必要的公共变量。

  说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。

3.3.2 仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。

  说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。

3.3.3 当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。

  说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。

3.3.4 防止局部变量与公共变量同名。

  说明:若使用了较好的命名规则,那么此问题可自动消除。

3.3.5 严禁使用未经初始化的变量作为右值。

  说明:引用未经赋值的变量,经常会引起系统崩溃。

3.3.6 结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。

  说明:软件向前兼容的特性,是软件产品是否成功的重要标志之一。如果要想使产品具有较好的前向兼容,那么在产品设计之初就应为以后版本升级保留一定余地,并且在产品升级时必须考虑前一版本的各种特性。

3.3.7 编程时,要注意数据类型的强制转换。

  说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。

3.3.8 尽量减少没有必要的数据类型默认转换与强制转换。

3.3.9 合理地设计数据并使用自定义数据类型,避免数据间进行不必要类型转换。

 

四、XML规范

4.1 布局

4.1.1 避免过多嵌套

  说明:嵌套的 LinearLayout 可能会使得 View 的层级结构很深。使用LinearLayout时,通常我们喜欢用嵌套的布局来动态设置一个View的Visibility ,由于LinearLayout是线性的,因此即使隐藏一个View也不会影响到其它View的排列。而在RelativeLayout中,View的位 置都是相对于其它View的,因此,隐藏之后,会导致之前的View没有参考对象了,导致的相对位置改变,这时你可以使用 alignWithParentIfMissing=”true”来处理这种情况。

此外,嵌套使用了 layout_weight 参数的 LinearLayout 的计算量会尤其大,因为每个子元素都需要被测量两次。这对需要多次重复 inflate 的 Layout 尤其需要注意,比如使用 ListView 或 GridView 时。

示例:如下布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>
</RelativeLayout>

可以直接写成如下布局

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Hello World!"/>

4.2 控件

4.2.1 控件中避免使用drawableLeftdrawableRightdrawableXXXXX。

  说明:使用这种标志在控件中绘制图片,导致图片大小不可控制,将产生严重的屏幕适配问题。

4.2.2 ImageView控件必须明确控制其大小,除非是适应屏幕宽或高,即只能使用match_parent或者明确值,如35dp、35px。

  说明:ImageView不明确设定大小,而采用wrap_content,则产生严重的屏幕适配问题。

4.3.3 控件中使用background属性,且值引用图片,则控件必须明确控制其大小,除非是适应屏幕宽或高,即只能使用match_parent或者明确值,如35dp、35px。

  说明:不明确设定大小,而采用wrap_content,则产生严重的屏幕适配问题。

4.3.4 控件设定明确的值大小,必须引用项目框架提供的值。

  说明:不引用项目提供的数据值,而使用自己设定的值如30sp、30dp、30px等,则产生严重的屏幕适配问题。

4.3.5 可以灵活使用控件,如TextView可以当做Button来使用。

原文地址:https://www.cnblogs.com/springl/p/8715259.html