一、 工具及环境规范
1、建议统一开发环境,包括JDK、android sdk、eclipse、adt、svn等 , 环境统一后,使得各开发人员在相互调试代码时做到快捷、方便
2、作bug系统,即类似友盟的bug系统,以方便开发人员追踪已上线版本的应用出现的bug。
3、代码时使用ctrl+shift+f进行代码格式化。其中preferences->Java->Code Style->Formatter->Edit->Line warpping设置格式化列数,建议统一定成160个字。
4、在Preferenes->General->Workspace->设置编码格式,建议统一设置为UTF-8。
二、 编码规范
1、命名规范(以主流的驼峰式为主)
(1) 成员变量、局部变量,以驼峰式方式展示,如private String mUserInfo,参考Android源码命名,即m+各单词首字母大写
(2) 静态变量、常量,以大写、下划线为主,如public static String USER_INFO="";
(3) Activity的命名:模块+修饰+Activity,
如用户设置界面:UserSettingActivity,用户信息界面:UserInfoActivity
(4) Fragment的命名:模块+修饰+Fragment,
如用户设置界面:UserSettingFragment,用户信息界面:UserInfoFragment
(5) Adapter的命名: 模块+修饰+Adapter
如用户设置界面:UserSettingAdapter,用户信息界面:UserInfoAdapter
(6) Holder的命名:模块+修饰+AdapterHolder
如用户设置界面:UserSettingAdapterHolder,
用户信息界面:UserInfoAdapterHolder
(7) layout的命名,
(a) activity对应的xml,activity+模块+修饰.xml
如用户设置界面: activity_user_setting.xml,
用户设置界面:user_info_activity.xml
(b) listview item对应的xml,模块+修饰+item.xml
如用户设置item:user_setting_item,用户设置界面:user_info_item.xml
(c) 组件对应的xml,widget+模块+修饰.xml
如widget_pull_down_view.xml
(8) layout中的id命名
命名规则:修饰_+x(x为layout或view等)
RelativeLayout、LinearLayout等四大布局:如top_bar_layout
TextView、EditText:如user_info_text
ImageView:如user_info_img
Button、ImageButton:如user_info_btn
ListView:如user_info_list
GridView:如user_info_grid
(9) drawable的命名
命名规则:修饰+d(default)/p(press)/s(select)
如用户头像
正常状态:user_icon_d.png
选择状态:user_icon_s.png
按下状态:user_icon_p.png
2、编码规范
(1) 服务器提供的字段通用,如在A、B接口中传送相同的字段时传送的value类型相同,不能一下yes/no,一下true/false;
(2) 服务器提供的字段简明扼要,尽量简短,加快传送速度,如userId使用id即可;要求服务器传送的数据尽量尽量添加Gzip过滤器,以加快传送速度;
(3) 统一服务器传送数据的方式,HttpClient(适合json传送)比HttpURLConnection(适合xml传送)传送较为方便,解析起来有面向对象的思路;
(4) 成员变量放在所有方法之前,这样方便开发人员查找成员变量的位置;
随意放位置,查找起来较为繁琐;
(5) 一个方法中尽量不超过100行,这样代码的可观性会稍强些;
(6) 避免代码的冗余,利用好抽象、封装、继承、多态,做到代码的重用,更大可能地利用到各项目的重用;
(7) 开发人员在开发项目时注意null、数组越界等常见的exception,如在使用该对象时,觉得有可能会出null指针的情况下,必须考虑进去,不然在测试时不出现,在客户手上出ANR错误,严重影响用户体验;
(8) 较为占用内存的对象手动设置null或recycle,以保证对象在最快的时间内被系统gc查找到;
(9) 处理内存优化时,可斟酌地使用SoftReference(仅在内存不足情况下执行gc才会将object回收,正常情况下gc不清理;softreference对象)或WeakReference(在执行gc时会将object对象回收),以达到内存释放;
(10) 在使用了数据库游标、字符流、字节流、service等,应将这些对象关闭,否则容易造成内存泄漏;
(11) 充分使用service与IntentService,Service适用于检查更新,IntentService适用于下载;
(12) 布局文件复用,使用include和merge标签达到布局文件的复用.组件通用,将经常使用的组件封装好,做好通用.
(13) style的复用,在一些组件的样式较为相同时,提取出相同的style放入styles.xml中.
(14) dip与sp的使用,dip适用于view的宽高,sp适用于textSize.
(15) 输入框的优化,如有多个输入框时可让键盘具有下一个功能,如数据库有搜索功能,可让键盘有搜索功能;
在用户体验上键盘放置位置是覆盖edittext还是将edittext往上挤压.
(16) 做好国际化,所有的java代码中只能注释为中文,其他提示语全部放在string.xml中;尽量不让服务器传送提示语,服务器的提示以errorcode方式传送过来,客户端通过errorcode来判断提示何种文字,如errorcode=1,用户密码验证失败.
(17) 采用mvc风格,做到高内聚低耦合。
三、 项目规范
(1)引用第三框架时,如第三方框架提供了jar包,直接导入即可;如只提供了源代码,则开发人员自己执行ant脚本或export出jar包提供给项目导入;源代码放入svn某特定位置,以方便其他开发人员学习;
(2)在svn目录下建立一个代码共享库,各开发人员可将开源的代码放入到这个共享库,方便技术交流;
(3)开发人员写的api,需要提供文档或demo,文档或demo逻辑要清晰,做到让同组的开发人员拿过来就能使用。
(4)尽量利用好抽象、封装、抽象、多态等,使用设计模式、反射等。
四、 性能优化
1、在不被继承的class上添加final
如: public final class A{}
2、for (int j = 0; j < element.length; j++)
改为for(int j = 0 , k = element.length; j < k ; j++)
减少执行element.length的次数
3、去除冗余的import,执行ctrl+shift+O
4、在eclipse提醒的地方添加@SuppressWarnings
让编译器更快知道真正有效的warning,加快编译速度
5、不显式调用System.gc(),否则破坏系统回收频率
6、选择集合的优先顺序
数组>List>Vector
数组不易确定长度,数组长度为真实长度
List异步,在add(object)时数组长度增加0.5倍
Vector同步,在add(object)时数组长度增加1倍
如List执行add(object)10次,则数组长度为15;
Vector执行add(object)10次,则数组长度为20
HashTable:同步,null不可作为key、value
HashMap:异步,null可作为key、value,
HashSet,异步,null可add
7、尽量使用ApplicationContext替代Context,使用Context不容易将内存释放
8、布局文件层次尽量少,如果层次过大,将影响用户在性能较差的机器进行体验。建议布局层次控制在10层之内。
9、在如下情况:
(1) 小米,有自带的清理功能,容易将内存中的数据清理.
(2) 应用长期放入后台,当内存不足情况会将内存清理
在编写代码时将数据放入文件中而不放static变量中,如登录的用户信息放在Sharepreference中,每次直接从其中取值
如果实在需要将数据放入static变量中,如模块信息,需要在activity的onSaveInstanceState执行保存。这样可以保证
在执行内存清理后打开应用还能将数据找回。
10、Res资源的优化
(1) 美工出图时尽量出高清图,高清图适配低清,否则低清图适配高清容易造成失真
(2) 高清图放入drawable-h文件中,如果放入drawable-m中会比放在drawable-h中占更大的内存
(3) 美工出图时注意图片不能过大,否则容易占用android内存,而且不易释放
(4) 使用容易占用内存的图片资源时,不直接在布局文件中添加图片资源,在需要显示该组件时进行setBackgroundResourse(drawable),不再显示时执行setBackground(null),这样方便在activity消亡时
内存可及时释放
11、在代码上线时使用2.3API中的StrictMode检查内存溢出问题
此类可检查数据库、游标等是否关闭
12、在应用过于庞大时,可将一个应用放入多个进程中
因一个应用默认情况下只开启一个进程,并且进程名为包名,通常地,开启24M的内存
若一个应用包含较多的模块时,且均占用较大的内存,可将占大内存的模块放入另一个进程中,达到多进程通信,增加应用内存
如播放音乐的Service可不放在主进程。
13、list view将view放入holder,以方便view的重用,增强性能。
五、技术交流
1、定期开展android技术交流,让android研发人员接触新知识,以讲课的形式探讨技术为主;
2、技术文档交流,可将学习到的技术资料放在共享库中;