android的编程规范是什么-mile米乐体育
android的编程规范是什么
这篇文章主要介绍“android的编程规范是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android的编程规范是什么”文章能帮助大家解决问题。
命名规则
1). 类名,接口名:
以大写开头,如果一个类的类名由多个单词组成,所有单词的首字母必须大写,单词尽量写全称,不要简写,除非约定俗成的名字,例如:url,rtmp,rtsp 这些广泛使用的专有名词,可以全部大写,也可以首字母大写。
例如 httprequest,courseactivity
2). 局部变量,类的成员变量,类的成员函数,函数参数:
以小写字母开头其他的单词首字母大写,变量名不建议使用下划线分隔单词,建议使用驼峰命名法,android的系统类都采用此方法。
例如 tostring() oncreateview(bundle savedinstancestate)
3). 静态常量:全部大写,单词之间使用下划线分开,常量单词全部大写,所以单词之间使用下划线分隔。
例如 what_empty_content
4). 控件变量的命名,控件的id命名:
建议:xml布局文件中的控件的id的命名与*.java的代码文件中的控件对象的命名一致。
classmyactivityextendsactivity{textviewtxtusername;…protectedvoidoncreate(bundlesavedinstancestate){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 | 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既可以是该颜色值使用的功能描述,也可以是该颜色值的英文描述,也可以是具体的颜色值,例如:
因为grey可能有很多等级,有时候需要不同等级的灰色,没有那么多英文名可以区分,所以名字中可以直接使用颜色值
注:不允许出现毫无意义的命名,例如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类型的数据并不是真实的实用的数据值(例如表示高度,宽度,大小等值),仅仅表示函数执行成功、失败、异常的状态值,并且这些值是有限的几个值,必须要将这些值使用静态常量描述,或者使用枚举,例如:
intgetjsonstring()
该函数返回-1表示获取解析json数据异常,返回0表示成功,返回1表示网络连接异常,返回2表示json内容中的数据部分为空。那么在函数内部的代码里不要直接使用这些字面值,这些字面值对于程序员来说是毫无意义的,代码可阅读性很差,建议做成下面的模式:
publicstaticfinalintresult_parse_json_exception=-1;publicstaticfinalintresult_success=0;publicstaticfinalintresult_network_exception=1;publicstaticfinalintresult_no_data=2;
使用这些符号常量值代替字面值的好处是,符号常量值是由大写的英文单词组成,是有意义的,可以帮助程序员更好的理解函数返回值的意义,而且符号常量值对应的具体的赋值在后期是很方便修改的。
activity接受参数与模块化
如果一个activity可能在多个地方被打开,或者一个fragment可能在多个地方被用到。那么在设计该activity和fragment 的时候一定要考虑低耦合,对外提供统一的参数接口,启
动activity的过程封装在该activity类的静态成员方法里面,类似如下:classmyactivityextendsactivity{...publicstaticvoidstartactivity(contextcontext,paramsparam){intentintent=newintent(context,myactivity.class);intent.putextra("param",param);startactivity(intent);}publicstaticvoidstartactivityforresult(contextcontext,paramsparam){intentintent=newintent(context,myactivity.class);intent.putextra("param",param);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***是能循环写日志文件到系统存储中,并且日志文件应该使用反复覆盖的方式重复利用。下面仅仅是一个不完善的例子:
publicclassmylog{publicstaticfinalstringtag="myapp";publicstaticvoidv(objecto,stringmessage){log.v(tag o.getclass().getsimplename(),message);}}
使用
mylog.v(this,"hellolog");
打印结果
v/myappmainactivity﹕hellolog
版本控制
使用自动化版本管理,自动生成版本号,使应用程序的版本与版本库上保持一致。使用hg替换工程目录下的app目录下的build.gradle文件 即可,如果manifest里面也有版本号的设置,androidstudio还是以build.gradle为准。不应该在每次发布的时候,在 androidstudio的工程设置里面手工修改版本号。
为程序添加全局异常捕获
应该为app添加全局异常捕获,app中总会有一些我们未捕获的异常,一旦用户使用过程中遇到这样的异常,程序就会崩溃,我们应该检测该类未捕获的异常信息,程序崩溃的时候通过写文件日志,或者发送邮件的方式获得异常信息,以便解决bug。
关于“android的编程规范是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。