命名规则1).类名、接口名:以大写开头。如果类名由多个单词组成,则所有单词的首字母必须大写。尽量写单词的全名,不要缩写,除非是习惯性的名字,比如:URL、RTMP、RTSP这些广泛使用的专有名词,可以全部大写,或者首字母大写。例如,HttpRequest、CourseActivity2)。局部变量、类成员变量、类成员函数、函数参数:以小写字母开头,其他单词首字母大写。不建议使用下划线来分隔变量名的单词。推荐使用驼峰命名,Android所有系统类都采用这种方式。例如toString()onCreateView(BundlesavedInstanceState)3)。静态常量:全部大写,单词之间用下划线分隔,常量单词全部大写,所以单词之间用下划线分隔。例如WHAT_EMPTY_CONTENT4)。控件变量和控件ID的命名:建议:xml布局文件中控件id的命名与*.java代码文件中控件对象的命名保持一致。classMyActivityextendsActivity{TextViewtxtUserName;…protectedvoidonCreate(BundlesavedInstanceState){txtUserName=(TextView)findViewById(R.id.txtUserName);}}5).常用控件和类对象命名规范(红色部分为建议的前缀或后缀):vvDescriptionImageViewimgDescriptionSpinnerspinDescriptionRadioButtonrbDescriptionWebViewwebViewDescriptionEditTexteditDescriptionListViewlistViewDescriptionScrollViewscrollDescriptionGridViewgridDescription处理程序描述HandlerRatingBarratingBarDescriptionPullToRefreshListViewpullRefreshViewDescriptionAdapterdescriptionAdapterFragmentdescriptionFragmentActivitydescription活动列表descriptionListMap<>mapDescriptionSlidingMenuslidMenuDescriptionViewPagerviewPagerDescription复选框chBoxDescription视图viewDescriptionRadioGrouprgDescriptionExpandableListViewexpDescriptionFrameLayoutsult(requestCode)REQUEST_CODE_DESCRIPTIONmsg.whatWHAT_DESCRIPTION6).资源命名:布局资源文件命名(全部小写,带下划线):活动资源文件:activity_description1_description2.xml片段资源文件:fragment_description1_description2.xmllistview列表项资源文件:list_item_description2_description.xml可重用(包含)组件资源文件:control_description1_description2.xmldrawable资源:controlName_description1_description2_selector。xmlcontrolName指示应该在哪种类型的控件上使用资源。资源的形式,如shape等图片资源的名称:同上颜色值的名称:color_description,前缀为color,全部小写,下划线分隔description可以是颜色值使用的函数描述,也可以是颜色值的英文描述,也可以是具体的颜色值,例如:#ffffff#cccccc#dddddd因为gray可能有很多层次,所以有时候需要不同层次的灰度,没有那么多英文名称来区分,直接用在name颜色值#4c4c4c根据功能定义描述,表示该颜色用于要按下的按钮。不允许直接硬编码文字常量。如果是控件上显示的文本,则必须放在strings.xml资源文件中。如果代码中使用常量字符串,则必须将其定义为publicstaticfinalString类型的常量值,并在代码中使用定义的常量值。这样做的好处是,如果后面需要修改常量值,只需要修改一处即可。如果硬写在代码里,凡是用到的地方都要修改,复制容易出错。Activity之间传递参数时,intent.putExtra的key值也必须按照规范命名,统一定义为静态常量,不能直接硬编码在代码中,否则想的时候会很麻烦修改它。当一个Activity在启动时需要接受参数,这些参数的关键定义应该放在Activity中。JSON解析Android中调用服务端的接口一般返回json数据。在解析json的时候,不管是使用原来的手动解析方式还是javabean解析方式,使用的时候解析出来的结果都要判断为空。处理。不允许由于服务端json问题导致app在解析json时崩溃。类成员初始化类的所有成员变量都必须赋初值,不允许只定义不赋值。Int类型常量函数返回时,如果返回的int类型数据不是真正的实用数据值(如高、宽、尺寸等),仅表示函数执行成功、失败、异常的状态值,而这些Values是有限的几个值,必须用静态常量,或者枚举来描述这些值,例如:intGetJsonString()这个函数返回-1表示获取和解析json数据异常,返回0表示成功,返回1表示网络连接异常,返回2表示json内容中data部分为空。那么就不要在函数内部的代码中直接使用这些字面值。这些字面值对程序员来说是没有意义的,代码可读性很差。建议做如下模式:publicstaticfinalintRESULT_PARSE_JSON_EXCEPTION=-1;publicstaticfinalintRESULT_SUCCESS=0;publicstaticfinalintRESULT_NETWORK_EXCEPTION=1;publicstaticfinalintRESULT_NO_DATA=2;使用这些符号常量值代替字面值的好处是符号常量值是由大写英文单词组成,意义深远,可以帮助程序员更好地理解函数返回值的含义,符号常量值对应的具体赋值也非常方便后期修改。如果一个Activity可能在多个地方打开,或者一个Fragment可能在多个地方使用,Activity接受参数和模块化。那么在设计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);意图。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的,对外不可见。也就是说,使用处理程序对象发送消息的细节不应该暴露给外界。List数据更新封装ListView数据更新,在handlerMessage中更新数据,避免java.lang.IllegalStateException问题Activity和Fragment之间传递参数Activity和Fragment数据传递采用接口方式,可以降低耦合,有利于Fragment多路复用:网络请求数据模块化一般,在Activity中,我们通过网络请求服务器的接口获取数据。这个过程一般在一个线程中完成。获取数据后,通过Activity中的handler发送消息,通知Activity更新数据。负责获取数据的线程类一般实现为Activity的内部类,可以直接访问Activity的成员变量,如handler、数据列表对象等。但是这样不利于数据获取线程的复用.如果另一个Activity也需要获取同样的数据,那么这个函数就不能被复用,所以负责数据请求的线程类不要和具体的Handler和Activity有太密切的关系。应该定义为静态类,handler应该作为参数传入,而不是直接访问外部类的成员变量。封装Log函数Log函数应该封装成一个TAG参数,自动改变当前类的类名,输出日志。发布的应用程序可以循环写入日志文件到系统存储,日志文件应该反复覆盖。重用。以下只是一个不完美的例子:publicclassMyLog{publicstaticfinalStringTAG="myapp";publicstaticvoidv(Objecto,Stringmessage){Log.v(TAG+o.getClass().getSimpleName(),message);}}使用MyLog.v(this,"你好日志");printresultV/myappMainActivity:hellolog版本控制使用自动化版本管理,自动生成版本号,使应用程序的版本与版本库保持一致。使用hg替换项目目录下app目录下的build.gradle文件。如果manifest中有版本号设置,AndroidStudio仍然以build.gradle为标准。每次发布时不要在AndroidStudio的项目设置中手动修改版本号。给程序添加全局异常捕获应该给app添加全局异常捕获。总会有一些我们没有在应用程序中捕捉到的异常。一旦用户在使用过程中遇到这样的异常,程序就会崩溃。我们应该检测这类未捕获异常的异常信息,当程序崩溃时,可以通过写文件日志或发送邮件的方式获取异常信息,从而解决bug。