1). 类名,接口名:html
以大写开头,若是一个类的类名由多个单词组成,全部单词的首字母必须大写,单词尽可能写全称,不要简写,除非约定俗成的名字,例如:URL,RTMP,RTSP 这些普遍使用的专有名词,能够所有大写,也能够首字母大写。java
例如 HttpRequest,CourseActivityandroid
2). 局部变量,类的成员变量,类的成员函数,函数参数:程序员
以小写字母开头其余的单词首字母大写,变量名不建议使用下划线分隔单词,建议使用驼峰命名法,Android的系统类都采用此方法。web
例如 toString() onCreateView(Bundle savedInstanceState)json
3). 静态常量:所有大写,单词之间使用下划线分开,常量单词所有大写,因此单词之间使用下划线分隔。网络
例如 WHAT_EMPTY_CONTENTapp
4). 控件变量的命名,控件的ID命名:ide
建议:xml布局文件中的控件的id的命名与*.java的代码文件中的控件对象的命名一致。模块化
class MyActivity extends Activity{ TextView txtUserName ; … protected void onCreate(Bundle savedInstanceState) { 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既能够是该颜色值使用的功能描述,也能够是该颜色值的英文描述,也能够是具体的颜色值,例如:
<color name="color_white">#ffffff</color> <color name="color_grey_ccc">#cccccc</color> <color name="color_grey_ddd">#dddddd</color>
由于grey可能有不少等级,有时候须要不一样等级的灰色,没有那么多英文名能够区分,因此名字中能够直接使用颜色值
<color name=”color_button_pressed”>#4c4c4c</color> 根据功能定义description,表示该颜色用于按钮被按下
注:不容许出现毫无心义的命名,例如textview1,textview2
代码中不容许出现直接硬编码的字面常量,若是是控件上面显示的文本,必须放在strings.xml资源文件中。 若是是代码中用到常量字符串,必须定义成 public static final String类型的常量值,在代码中使用该定义的常量值。这样作的好处是之后须要修改该常量值,只须要修改一个地方。若是是硬编码在代码中则要修改全部使用它的地方,并且拷贝容易出错。在Activity之间传递参数的时候,intent.putExtra 的key值也要命名规范,而且统必定义为静态常量,不能直接硬编码在代码中,不然想要修改的时候很麻烦。某一个Activity在被启动的时候须要接受参数,那么这些参数的key定义就应该放在该Activity中。
Android中调用服务端的接口通常返回的是json数据,在解析json的时候,不管是使用原始的手工解析方式,仍是使用javabean的解析方式,解析出来的结果在使用的时候必须都进行判空处理。不容许由于服务端的json出问题,致使app在解析json的时候出现崩溃。
全部类的成员变量必定要赋初始值,不容许只定义,不赋值。
函数返回的时候,若是返回的int类型的数据并非真实的实用的数据值(例如表示高度,宽度,大小等值),仅仅表示函数执行成功、失败、异常的状态值,而且这些值是有限的几个值,必需要将这些值使用静态常量描述,或者使用枚举,例如:
int GetJsonString()
该函数返回-1表示获取解析json数据异常,返回0表示成功,返回1表示网络链接异常,返回2表示json内容中的数据部分为空。那么在函数内部的代码里不要直接使用这些字面值,这些字面值对于程序员来讲是毫无心义的,代码可阅读性不好,建议作成下面的模式:
public static final int RESULT_PARSE_JSON_EXCEPTION = -1; public static final int RESULT_SUCCESS = 0; public static final int RESULT_NETWORK_EXCEPTION = 1; public static final int RESULT_NO_DATA = 2;
使用这些符号常量值代替字面值的好处是,符号常量值是由大写的英文单词组成,是有意义的,能够帮助程序员更好的理解函数返回值的意义,并且符号常量值对应的具体的赋值在后期是很方便修改的。
若是一个Activity可能在多个地方被打开,或者一个Fragment可能在多个地方被用到。那么在设计该Activity和Fragment的时候必定要考虑低耦合,对外提供统一的参数接口,启动Activity的过程封装在该Activity类的静态成员方法里面,相似以下:
class MyActivity extends Activity{ ... public static void startActivity(Context context,Params param){ Intent intent = new Intent(context, MyActivity.class); intent.putExtra("param", param); startActivity(intent); } public static void startActivityForResult(Context context,Params param){ Intent intent = new Intent(context, MyActivity.class); intent.putExtra("param", param); startActivityForResult(intent,REQUEST_CODE); } }
参数的传递最好是封装在一个Model实体类中,避免使用Map这种方式进行参数传递。建议该实体类实现为对应的Activity的静态可序列化的内部类。
AndroidStudio中的项目的包结构应该根据工程各个部分的功能来组织。
每个Activity里面几乎都会定义一个Handler内部类,可是不少Activity里面的Handler都使用了重复的消息类型,这里面是有冗余代码的,因此应该把这些Activity都使用到的Handler类的消息部分,提取成一个公用的Handler类。而后在各个Activity里面使用继承的方式,来提供该Activity特有的Handler消息类型的Handler类实现。
另外Handler发送消息应该使用Handler类的成员函数,不该该直接使用handler.obtainMessage(xxx).sendToTarget();
这种原始的发送消息的方式,这样不利于下降耦合,这种细节应该隐藏在Handler内的里面。Handler的消息类型应该定义为Handler类里面的静态常量,而该常量不该是public的,对外部不可见。也就是说使用handler对象发送消息的细节不该该暴露给外部。
封装ListView的数据更新,在handlerMessage中更新数据,避免出现 java.lang.IllegalStateException 问题
Activity与Fragment的数据传递采用interface的方式,这样能够下降耦合,有利于Fragment的复用:
通常在Activity中咱们经过网络请求服务端的接口得到数据,这个过程通常是在一个线程中作的,获取到数据以后,再经过Activity中的handler发送消息来通知Activity更新数据。该负责获取数据的线程类,咱们通常都实现为一个Activity的内部类,该类能够直接访问Activity的成员变量,例如handler,数据列表对象等。可是这样不利于该数据获取线程的复用。若是另外一个Activity里面也须要获取相同的数据,那么这个功能是不能复用的,因此这个负责数据请求的线程类,不该该与具体的Handler和Activity联系过于紧密。应该定义为一个静态类,handler应该做为参数传递进来,而不是直接访问外部类的成员变量。
Log功能应该封装成为自动将当前所在类的类名变成log输出的TAG参数,发布的app最好是能循环写日志文件到系统存储中,而且日志文件应该使用反复覆盖的方式重复利用。下面仅仅是一个不完善的例子:
public class MyLog { public static final String TAG = "myapp "; public static void v(Object o,String message) { Log.v(TAG+o.getClass().getSimpleName(),message); } }
使用
MyLog.v(this,"hello log");
打印结果
V/myapp MainActivity﹕ hello log
使用自动化版本管理,自动生成版本号,使应用程序的版本与版本库上保持一致。使用hg替换工程目录下的app目录下的build.gradle文件便可,若是manifest里面也有版本号的设置,AndroidStudio仍是以build.gradle为准。不该该在每次发布的时候,在AndroidStudio的工程设置里面手工修改版本号。
应该为app添加全局异常捕获,app中总会有一些咱们未捕获的异常,一旦用户使用过程当中遇到这样的异常,程序就会崩溃,咱们应该检测该类未捕获的异常信息,程序崩溃的时候经过写文件日志,或者发送邮件的方式得到异常信息,以便解决bug。