工作系列 02:Android 开发规范
####Android 开发规范
1. 成员变量
-
类中成员变量采用m开头的驼峰命名法则,例如:mShopId
-
方法中变量采用第一个单词小写的驼峰命名法则,例如:shopId;
-
项目中全局变量采用g开头的驼峰命名法则,例如:gShopId;
-
项目中常量命名规则,采用下划线来分割这些字母都大写的单词,例如:NUM_DAYS_IN_WEEK
2. 类名
-
Activity命名(其中Act表示是一个Activity) Example: 店铺列表的 Activity: ShopListAct.java 店铺列表对应xml: shop_list_act.xml
-
大类Fragment命名 Example: 店铺列表Activity中Fragment命名: ShopListFragment.java 上述Fragment对应布局xml: shop_list_fragment.xml
-
小类Fragment命名 Example: 店铺列表 ShopListFragment中又初始化一个Fragment,用来表示一种
子类型(例如:KTV) 此时我们命名:ShopListKtvFragment.java 上述Fragment对应的布局xml:shop_list_ktv_fragment.xml -
大类Fragment中具体Item命名 ShopListItem.java 布局文件xml:shop_list_item.xml
-
小类Fragment中具体Item命名 ShopListKtvItem.java 布局文件xml: shop_list_ktv_item.xml
综上:Class命名规则大概如下:
-
6.1. 如果是Activity,最好以Act.java结尾
-
6.2. 如果是Fragment,最好以Fragment.java结尾
-
6.3. Act.java的文件,前面最好是对应模块的英文单词, 例如:注册的Activity,我们命名为:RegisterAct.java,或者简写的RegAct.java; 在例如店铺的一个列表,我们命名为:ShopListAct.java,我们就清楚知道ShopList是店铺列表意思,Act.java是一个Activity类文件.
-
6.4. Fragment.java文件同上述3所述,ShopListFragment.java,我们也就知道该Class的大概功能了.并且6.3与6.4之间,我们还可以看出一个从属关系,都是ShopList开头的,我们就默认ShopListFragment.java是ShopListAct.java中的Fragment.
3. 包名
-
包名命名规范(com.项目名称.模块名称..) 独立模块包名命名规范 com + meiliyue + 模块名 + 其他 例如:登录模块命名如下:com.meiliyue.login 例如:注册模块命名如下:com.meiliyue.register
- 注册模块中如果有使用到相关实体类,增加包如下: com.meiliyue.register.entity
- 注册模块中如果有使用到第三方控件,增加包如下: com.meiliyue.register.widgets
- 注册模块中,存在所有Activity,不增加新子包名,直接放在 com.meiliyue.register
- 注册模块中,隶属于Activity的Fragment ,均放置在Activity一起,无需新增包
- 如果Fragment使用类似ListView或RecyclerView来实现,就会涉及到具体各种类型Item,需要增加包如下: com.meiliyue.register.item
- 注册模块中,如果存在一些工具类,增加包如下: com.meiliyue.register.util
- 另外如我们现在所做的时市模块,包含“下单”,“出售技能”,“管理技能”模块,我们就可以分别在com.meiliyue.timemarket下面创建
- com.meiliyue.timemarket.sell
- com.meiliyue.timemarket.manager
- com.meiliyue.timemarket.service 等几个包,便于区分和阅读.
4. 字符串对比
- 字符串对比时,举例:TextUtils.equals(bgMusicType, “shortbg”) 或者采用”shortbg”.equals() ,常量在前,避免空指针报错;
5. 工具类库使用
-
工具类库参考,一律使用公共库资源,尽量避免自己添加一些工具类,基本的如:列表判断为空逻辑;验证输入字符串格式问题;排序问题;
-
项目中任何新功能开发,主动的咨询下,是否以前实现过类似的功能,避免走弯路;
-
项目中,保存配置文件代码中,分两个文件保存,一个是注销登录后,会清除的文件;一个是注销后,仍然保存在哪里的文件;知晓下
public static final String Pref_Name = “mly”;
// 保存的键值信息只有当清除数据或卸载应用后才会进行数据清空操作. 也用于保存例如上一次登录用户的id信息,保存应用的版本信息.
public static final String Pref_Ever_Name = “mPermanent”;
- 使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况
6. 代码提交注意点 //TODO
- 所有代码,提交前,先更新后上传,解决冲突时,不清楚的直接追踪责任人,确认后,在合并代码;必须格式化代码提交,后续给个Android Studio格式化的配置文件
7. 工具类库(com.trident.framework:tool:1.0.31)
- Log日志,统一采用CLog.java工具类(逐渐去除MLog.java)
- SysUtil.java主要对一些列表判空判断等
- MD5.java转换
- Pixel dp转换:PixelDpUtils.java(可以尽量不传Context)
- 屏幕宽高,状态栏,导航栏尺寸(ScreenUtil.java)
- 全局Toast提示(ToastUtils.java)
8. 代码写法
- 1.代码书写合理:不准出现一行代码,if判断,不加{}的情况,尽量让代码看起来规范,可读性强
eg:mHasMore = channelEntityBack.getHas_more() == 1;
最好书写如下:
eg:mHasMore = (channelEntityBack.getHas_more() == 1);
- 2.变量(成员变量,方法内变量,类变量,全局变量,常量),类名,包名,都按照上述1,2所述命名:
方法一律采用有意义的头单词小写的驼峰命名法则;比如:
setDrawGuessStrategy(杨松),submitAddOrder(雅荣)
不要出现类似:
private View point_action1;
-
使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView的方法中无论这项的每个视图是否需要设置属性(比如TextView设置的属性可能为null,item的某一个按钮的背景为透明、某一项的颜色为透明等),都需要为每一项的所有视图设置属性(textview的属性为空也需要设置setText(“”),背景透明也需要设置),否则在滑动的过程中会出现内容的显示错乱
-
在Fragment中嵌套Fragment时,注意getSupportFragmentManager()和getChildFragmentManager()使用,避免嵌套Fragment不展示的问题出现
-
Cursor在使用时,有一个原则:第一步判断非空 最后一步:关闭Cursor
-
避免过多定义静态变量,静态变量在不同的类和包中都可以方便使用,在虚拟机中单独占用内存;然而项目中使用static的很多地方会莫明的出现空指针异常的错误,经过排查,可能就是static的问题.Application是与应用同时存在的,也就是应用在它就在,并不会被GC给莫名其妙的回收掉,因此,使用此方法更加安全
-
应用中所有弹框的一些选项适配器数据即String Array,统一整理放置到
-
所有一些公用的变量都统一写在ConstantPools.java里面,通过通俗易懂的常量命名来使用,不要在项目中使用各种代表各种含义的常量1,2等.
-
RelativeLayout布局里面不要存在类似:android:orientation=”vertical”之类的无效元素;
-
PhoneUtil.java工具类中关于手机各种信息的获取方法,后续将Phone.java中各种方法也统一整理到PhoneUtil.java当中
- 所有广播统一写到IBroadcastPools.java文件当中
9. 文案配置
- 类中不允许存在中文字符串,一律保存在strings.xml中,便于以后国际化
10. 代码注释
-
比较通用的类,最好标注下该类在哪几种情况下会被调用.
-
代码尽量加注释,要么就命名让人一看就知道此类是处理何种逻辑.
11. AS使用技巧汇总//TODO
-
一个AS的工程中,module不宜太多,否则会影响编译的速度,建议将不是经常变动的module打包成aar,主工程直接依赖aar可以大大提高编译的速度,后续马上要做的一件事情,是将工具库做成.aar
12. 后续项目中,弹出省份城市选择框,调用工具类WheelFactory.java相关方法使用.
-
例如: 时市页面,进行地区筛选,查找相关地区的服务,例如:湖北,武汉
其中provList为省份列表;cityList为对应省份的城市列表; WheelFactory.getWheelFactory().showAreaWheel(getActivity(), provList, cityList, "湖北", "武汉", "", new IAreaBundleCallBack() { // 该回调方法返回bundle数据. @Override public void onSelectEnd(Bundle data) { confirm(data); } // 该方法返回省份,城市两个字符串. @Override public void onSelectEnd(String province, String city) { confirm(data); } }); 其中provList为省份列表;cityList为对应省份的城市列表; WheelFactory.getWheelFactory().showAreaWheel(getActivity(), provList, cityList, "湖北", "武汉", "", new IAreaCallBack() { // 该方法返回省份,城市两个字符串. @Override public void onSelectEnd(String province, String city) { confirm(data); } });