Android编程规范不完全指南

命名规则

1). 类名,接口名:

以大写开头,如果一个类的类名由多个单词组成,所有单词的首字母必须大写,单词尽量写全称,不要简写,除非约定俗成的名字,例如:URL,RTMP,RTSP 这些广泛使用的专有名词,可以全部大写,也可以首字母大写。

例如 HttpRequest,CourseActivity

2). 局部变量,类的成员变量,类的成员函数,函数参数:

以小写字母开头其他的单词首字母大写,变量名不建议使用下划线分隔单词,建议使用驼峰命名法,Android的系统类都采用此方法。

例如 toString()  onCreateView(Bundle savedInstanceState)

3). 静态常量:全部大写,单词之间使用下划线分开,常量单词全部大写,所以单词之间使用下划线分隔。

例如 WHAT_EMPTY_CONTENT

4). 控件变量的命名,控件的ID命名:

建议:xml布局文件中的控件的id的命名与*.java的代码文件中的控件对象的命名一致。


  1. class  MyActivity extends Activity{ 
  2. TextView  txtUserName  ; 
  3. … 
  4. protected void onCreate(Bundle savedInstanceState) { 
  5.   txtUserName =  (TextView) findViewById(R.id.txtUserName); 

5). 常用控件以及类对象命名的规范说明(红色部分为建议的前缀或者后缀):


类名


变量名


类名


变量名


TextView


txtDescription


ProgressBar


progressDescription


Button


btnDescription


SeekBar


seekBarDescription


ImageButton


imgBtnDescription


VideoView


vvDescription


ImageView


imgDescription


Spinner


spinDescription


RadioButton


rbDescription


WebView


webViewDescription


EditText


editDescription


ListView


listViewDescription


ScrollView


scrollDescription


GridView


gridDescription


Handler


descriptionHandler


RatingBar


ratingBarDescription


PullToRefreshListView


pullRefreshViewDescription


Adapter


descriptionAdapter


Fragment


descriptionFragment


Activity


descriptionActivity


List<T>


descriptionList


Map<>


mapDescription


SlidingMenu


slidMenuDescription


ViewPager


viewPagerDescription


CheckBox


chBoxDescription


View


viewDescription


RadioGroup


rgDescription


ExpandableListView


expDescription


FrameLayout


frameLayDescription


SharedPreferences


spDescription


LinearLayout


lineLayDescription


RelativeLayout


relativeLayDescription


startActivityForResult(requestCode)


REQUEST_CODE_DESCRIPTION


msg.what


WHAT_DESCRIPTION

6). 资源命名:

layout资源文件的命名(全部小写,下划线分隔):
activity的资源文件:activity_description1_description2.xml
fragment的资源文件:fragment_description1_description2.xml
listview列表项的资源文件:list_item_description1_description2.xml
可复用(被include)的组件资源文件: control_description1_description2.xml
drawable资源: controlName_description1_description2_selector.xml
controlName表示该资源要用在什么类型的控件上面,例如如果是按钮的图片切换则
应该这么定义 button_bg_sendmessage_selector.xml
selector表示该资源的形式,例如还有shape等
图片资源的名字:同上
颜色值的命名:  color_description  以color为前缀,全部小写,下划线分隔。description既可以是该颜色值使用的功能描述,也可以是该颜色值的英文描述,也可以是具体的颜色值,例如:


  1. <color name="color_white">#ffffff</color> 
  2. <color name="color_grey_ccc">#cccccc</color> 
  3. <color name="color_grey_ddd">#dddddd</color> 

因为grey可能有很多等级,有时候需要不同等级的灰色,没有那么多英文名可以区分,所以名字中可以直接使用颜色值
<color name=”color_button_pressed”>#4c4c4c</color> 根据功能定义description,表示该颜色用于按钮被按下


  1. 注:不允许出现毫无意义的命名,例如textview1,textview2 

关于字面常量

代码中不允许出现直接硬编码的字面常量,如果是控件上面显示的文本,必须放在strings.xml资源文件中。
如果是代码中用到常量字符串,必须定义成 public static final
String类型的常量值,在代码中使用该定义的常量值。这样做的好处是以后需要修改该常量值,只需要修改一个地方。如果是硬编码在代码中则要修改所有使
用它的地方,而且拷贝容易出错。在Activity之间传递参数的时候,intent.putExtra
的key值也要命名规范,并且统一定义为静态常量,不能直接硬编码在代码中,否则想要修改的时候很麻烦。某一个Activity在被启动的时候需要接受参
数,那么这些参数的key定义就应该放在该Activity中。

JSON解析

Android中调用服务端的接口一般返回的是json数据,在解析json的时候,无论是使用原始的手工解析方式,还是使用javabean的解
析方式,解析出来的结果在使用的时候必须都进行判空处理。不允许因为服务端的json出问题,导致app在解析json的时候出现崩溃。

类成员初始化

所有类的成员变量一定要赋初始值,不允许只定义,不赋值。

Int类型常量

函数返回的时候,如果返回的int类型的数据并不是真实的实用的数据值(例如表示高度,宽度,大小等值),仅仅表示函数执行成功、失败、异常的状态值,并且这些值是有限的几个值,必须要将这些值使用静态常量描述,或者使用枚举,例如:


  1. int  GetJsonString() 

该函数返回-1表示获取解析json数据异常,返回0表示成功,返回1表示网络连接异常,返回2表示json内容中的数据部分为空。那么在函数内部的代码里不要直接使用这些字面值,这些字面值对于程序员来说是毫无意义的,代码可阅读性很差,建议做成下面的模式:


  1. public static final int RESULT_PARSE_JSON_EXCEPTION = -1; 
  2. public static final int RESULT_SUCCESS = 0; 
  3. public static final int RESULT_NETWORK_EXCEPTION = 1; 
  4. public static final int RESULT_NO_DATA = 2; 

使用这些符号常量值代替字面值的好处是,符号常量值是由大写的英文单词组成,是有意义的,可以帮助程序员更好的理解函数返回值的意义,而且符号常量值对应的具体的赋值在后期是很方便修改的。

Activity接受参数与模块化

如果一个Activity可能在多个地方被打开,或者一个Fragment可能在多个地方被用到。那么在设计该Activity和Fragment 的时候一定要考虑低耦合,对外提供统一的参数接口,启


  1. 动Activity的过程封装在该Activity类的静态成员方法里面,类似如下: 
  2.  
  3. class MyActivity extends Activity{ 
  4. ... 
  5. public static void startActivity(Context context,Params param){ 
  6.   Intent intent = new Intent(context, MyActivity.class);  
  7.   intent.putExtra("param", param); 
  8.   startActivity(intent); 
  9.  
  10. public static void startActivityForResult(Context context,Params param){ 
  11.   Intent intent = new Intent(context, MyActivity.class);  
  12.   intent.putExtra("param", param); 
  13.   startActivityForResult(intent,REQUEST_CODE); 

参数的传递最好是封装在一个Model实体类中,避免使用Map这种方式进行参数传递。建议该实体类实现为对应的Activity的静态可序列化的内部类。

AndroidStudio工程目录组织

AndroidStudio中的项目的包结构应该根据工程各个部分的功能来组织。

Handler的封装

每一个Activity里面几乎都会定义一个Handler内部类,但是很多Activity里面的Handler都使用了重复的消息类型,这里面

是有冗余代码的,所以应该把这些Activity都使用到的Handler类的消息部分,提取成一个公用的Handler类。然后在各个Activity
里面使用继承的方式,来提供该Activity特有的Handler消息类型的Handler类实现。

另外Handler发送消息应该使用Handler类的成员函数,不应该直接使用handler.obtainMessage(xxx).sendToTarget();

种原始的发送消息的方式,这样不利于降低耦合,这种细节应该隐藏在Handler内的里面。Handler的消息类型应该定义为Handler类里面的静
态常量,而该常量不应是public的,对外部不可见。也就是说使用handler对象发送消息的细节不应该暴露给外部。

List的数据更新

封装ListView的数据更新,在handlerMessage中更新数据,避免出现 java.lang.IllegalStateException 问题

Activity与Fragment之间传递参数

Activity与Fragment的数据传递采用interface的方式,这样可以降低耦合,有利于Fragment的复用:

网络请求数据模块化

一般在Activity中我们通过网络请求服务端的接口获得数据,这个过程一般是在一个线程中做的,获取到数据之后,再通过Activity中的
handler发送消息来通知Activity更新数据。该负责获取数据的线程类,我们一般都实现为一个Activity的内部类,该类可以直接访问
Activity的成员变量,例如handler,数据列表对象等。但是这样不利于该数据获取线程的复用。如果另一个Activity里面也需要获取相同
的数据,那么这个功能是不能复用的,所以这个负责数据请求的线程类,不应该与具体的Handler和Activity联系过于紧密。应该定义为一个静态
类,handler应该作为参数传递进来,而不是直接访问外部类的成员变量。

封装Log功能

Log功能应该封装成为自动将当前所在类的类名变成log输出的TAG参数,发布的app最好是能循环写日志文件到系统存储中,并且日志文件应该使用反复覆盖的方式重复利用。下面仅仅是一个不完善的例子:


  1. public class MyLog { 
  2.   public static final String TAG = "myapp "; 
  3.   public static void v(Object o,String message) 
  4.   { 
  5.       Log.v(TAG+o.getClass().getSimpleName(),message); 
  6.   } 

使用


  1. MyLog.v(this,"hello log"); 

打印结果


  1. V/myapp MainActivity﹕ hello log 

版本控制

使用自动化版本管理,自动生成版本号,使应用程序的版本与版本库上保持一致。使用hg替换工程目录下的app目录下的build.gradle文件
即可,如果manifest里面也有版本号的设置,AndroidStudio还是以build.gradle为准。不应该在每次发布的时候,在
AndroidStudio的工程设置里面手工修改版本号。

为程序添加全局异常捕获

应该为app添加全局异常捕获,app中总会有一些我们未捕获的异常,一旦用户使用过程中遇到这样的异常,程序就会崩溃,我们应该检测该类未捕获的异常信息,程序崩溃的时候通过写文件日志,或者发送邮件的方式获得异常信息,以便解决bug。

来源:51CTO

时间: 2024-05-08 15:19:43

Android编程规范不完全指南的相关文章

android 编程规范 谁那里有啊

问题描述 android 编程规范 谁那里有啊 谁那里有android 编程规范 google的英文的也行?谁有指教一下呗,O(∩_∩)O谢谢 解决方案 http://blog.csdn.net/huangyabin001/article/details/30717841 解决方案二: http://blog.csdn.net/wwj_748/article/details/42347283 参考这个. 解决方案三: https://github.com/ribot/android-guidel

Oracle PL/SQL编程规范指南

一.PL/SQL编程规范之大小写 就像在SQL中一样,PL / SQL中是不区分大小写的.其一般准则如下: 关键字(BEGIN, EXCEPTION, END, IF THEN ELSE,LOOP, END LOOP).数据类型(VARCHAR2, NUMBER). 内部函数(LEAST, SUBSTR)和用户定义的子程序(procedures, functions,packages),使用大写. 变量名以及SQL中的列名和表名,使用小写. 二.PL/SQL编程规范之空白 空白(空行和空格)在P

C#编程规范和惯例

编程|规范 谁都会写代码!几个月的编程经验可以让你写出"可运行应用程序".让它可运行容易,但是以最有效率的方式编码就需要下更多的功夫! 要知道,大多数程序员在写"可运行代码,"而不是"高效代码".我们在这个指南课程前面提到,你想成为你们公司"最尊贵的专业人员"吗?写"高效代码"是一项艺术,你必须学习和实践它. 命名惯例和规范 注记 : Pascal 大小写形式-所有单词第一个字母大写,其他字母小写.Came

Android编程之绝对布局AbsoluteLayout和相对布局RelativeLayout实例详解_Android

本文实例分析了Android编程之绝对布局AbsoluteLayout和相对布局RelativeLayout.分享给大家供大家参考,具体如下:  一.绝对布局AbsoluteLayout 绝对定位AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差. 下面我们举一个例子看看:例子里的机器人图片大小是250X250,可以看到我们使用android:layout_x和android:l

Android 命名规范 (提高代码可以读性)

先初略介绍下当前主要的标识符命名法和英文缩写规则:(这段别人那边借鉴的) 在讲解命名规范前,先初略介绍下当前主要的标识符命名法和英文缩写规则.标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写. 2 帕斯卡(pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写 3 下划线命名法:单词与单词间用下划线做间隔. 4 匈牙利命名法:广泛应用于微软编程环境中,在以Pascal命名法的变量前附加小写序列说明该变量的类型

指针-好的编程规范有哪些,希望大家集思广益

问题描述 好的编程规范有哪些,希望大家集思广益 比如在动态为一个指针分配完内存后,使用这块内存,最后通过这个指针释放这块内存,这时候比较好的规范是在释放完内存之后将指针置为NULL. 再比如刚刚声明一个指针的时候,最好显式将它初始化为NULL. 类似这样的小细节但是很重要的编程规范,当然其他的任何形式的好的编程规范都希望大家能说一下,供大家互相学习! 解决方案 看<林锐-高质量C.C++编程指南> 就你现在的水平,不需要什么集思广益和讨论,把那本教程看明白足够你学的了. 解决方案二: 参考:h

Android编程实现仿iphone抖动效果的方法(附源码)_Android

本文实例讲述了Android编程实现仿iphone抖动效果的方法.分享给大家供大家参考,具体如下: 布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" and

Android编程实现一键锁屏的方法_Android

本文实例讲述了Android编程实现一键锁屏的方法.分享给大家供大家参考,具体如下: 这里要用到下面两个类: DeviceAdminReceiver 设备管理组件.这个类提供了一个方便解释由系统发出的意图的动作.你的设备管理应用程序必须包含一个DeviceAdminReceiver的子类.本程序中,就代表一个手机上的设备管理器. DevicePolicyManager 一个管理设备上规范的类. 大多数客户端必须声明一个用户当前已经启用的DeviceAdminReceiver. 这个DeviceP

Android编程中@id和@+id的区别分析_Android

本文分析了Android编程中@id和@+id的区别.分享给大家供大家参考,具体如下: Android中的组件需要用一个int类型的值来表示,这个值就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后面使用"+",表示当修改完某个布局文件并保存后,系统会自动在R.java文件中生成相应的int类型变量.变量名就是"/"后面的值,例如,@+id/xyz会在R.java文件中生成int