前言:html
目前工做负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,彻底单挑。android
现大框架已经完成,正在进行细节模块上的开发网络
抽空总结一下Android项目的开发规范:一、编码规范 二、命名规范 数据结构
注:我的经验,经供参考架构
--------------------------------------------------------------------------------------------------------------------------app
1、Android编码规范框架
一、学会使用string.xml文件ide
在我看来,当一个文本信息出现的次数大于一次的时候就必需要使用string.xml布局
好比一个保存按钮 , 不规范写法:学习
<Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" />
这里给它的文本内容设置为"保存",那么一个app中全部的保存按钮都这样写。当有一天要修改需求了,要求把“保存”文字改为“提交”,那么咱们只能去一个个布局文件中修改,
岂不浪费大量时间又可能会存在漏掉修改的状况。
规范写法:
<Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/save" />
而在string.xml文件中:
<string name="save">保存</string>
这种写法,日后须要修改,只须要在string.xml文件中修改一行代码 便实现了整个APP的该文本内容修改。
二、学会使用color.xml ,dimens.xml文件的使用
同string.xml使用一致,同窗们应该都懂的,切勿由于一时的懒,致使后期的迭代费时费力。
三、团队协同肯定一套标准Activity的onCreate()方法中代码执行流程
其实刚接触Android的时候,个人不规范代码是这样的:
private Button scan; //扫描按钮 private Button create; //建立按钮 private ArrayList<Object> datas; //数据源 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); create = (Button) findViewById(R.id.create); scan = (Button) findViewById(R.id.scan); scan.setOnClickListener(this); create.setOnClickListener(this); datas = new ArrayList<>(); datas.add(new Integer(1)); datas.add(new Integer(2)); datas.add(new Integer(3)); datas.add(new Integer(4)); }
什么都无论,全部的操做代码都写在onCreate()方法中,包括find控件。设置监听事件,加载数据源等等。
能够看到如今就2个控件一个数据源,代码就这么多了,若是一个界面有10多个控件呢,那onCreate()方法中的代码量就成倍数的多起来了。
因此全部的Activity都要设定一个统一的规范。
咱们都知道,一个Activity中有基本都有的操做:
①、初始化变量
②、初始化控件
③、设置监听事件
④、加载网络数据并显示
那么就能够将以上的代码分门别类的放在这几个方法中
好比一段规范代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_scan; //扫描按钮 private Button btn_create; //建立按钮 private ArrayList<Object> datas; //数据源 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initVariables(); initView(); initEvent(); loadData(); } //初始化变量,好比 上一个Activity传来的Intent的数据 本Activity中一些标记变量等 private void initVariables() { } //加载数据源 private void loadData() { } //注册监听事件 private void initEvent() { btn_scan.setOnClickListener(this); btn_create.setOnClickListener(this); } //初始化控件 private void initView() { btn_create = (Button) findViewById(R.id.create); btn_scan = (Button) findViewById(R.id.scan); } //设置点击事件 @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_scan: //扫描二维码 startActivity(new Intent(this,ScanActivity.class)); break; case R.id.btn_create: //生成二维码 startActivity(new Intent(this,CreateActivity.class)); break; } } }
能够看到,onCreate()中就那么几个方法了,咱们须要找问题的时候在相应的方法中去找便可,既方便又清晰。
其实这种操做咱们能够写一个BaseActivity做为它的的抽象方法,而后让Activity继承这个BaseActivity基类重写方法便可,涉及到架构,这个日后再说。
四、团队协同肯定一种控件的点击事件OnClickListener()
Android给咱们提供5种给控件设置OnClick的方法,我的以为项目中用的最多的就是
①、参数this 而后Activity 实现 View.OnClickListener接口 重写 onClick()方法
btn_create.setOnClickListener(this);
②、直接参数new OnclickListener()的
btn_create.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });
其余三个方法我的以为尽可能不要用。而这两种方法中第一种 是更好的,由于咱们能够经过switch--case 的方法区分不一样控件的点击事件,代码更清晰简约。
固然第二种方法也是能够的,可是切记同一个项目中最好只有一种方式,便于后期的维护。
//设置点击事件 @Override public void onClick(View v) { switch (v.getId()){ case R.id.scan: //扫描二维码 startActivity(new Intent(this,ScanActivity.class)); break; case R.id.create: //生成二维码 startActivity(new Intent(this,CreateActivity.class)); break; } }
五、尽可能少用全局变量static进行传值操做
static的特性你们应该都是知道的,他会一直占用一部份内存,虽然不多,可是一个项目中成百上千个使用的话,对项目是很是很差的。
建议页面之间的传值仍是用Intent ,实现没有好的解决方案的再用static , PS ,我以前公司的项目就很是大量的使用了static
注:有些同窗可能对Activity和Fragment的互相传值不大会,这里推荐一个解决方案:Android项目实战(十三):浅谈EventBus , 对我来讲是项目必备,可是也要合理运用
六、Activity中尽可能不要使用内部类
这里以RecyclerView举例,一款很是棒的控件,有了它不再用ListView了 ,浅谈RecyclerView(完美替代ListView,GridView)
一个RecyclerView是配套一个Adapter和一个ViewHolder的。
不规范作法:部分同窗图省事(固然放在一个Activity中确实方便数据传输和item点击事件操做),把它们都写在一个Activity中,这样是不可取的,由于大大的增长了单个Activity的代码量,对维护来讲很不方便。
规范作法: ViewHolder一个类 ,Adapter一个类 , 分工明确 ,避免一个类中代码量过多的问题。
注:ListView,ViewPager 使用同上
至于类的分类,有的同窗喜欢一个功能模块放在一个包下,好比一个功能点的Activity , Adapter ,ViewHolder都放在一个包下
有的同窗喜欢一种类的放在一个包下,好比将全部的Activity放在activitys包下,将全部的Adapter放在adapters包下。
这都是后话,未来学习架构的时候再详谈
七、使用ArrayList代替HashMap
听说,是听说,ArrayList使用的内存要低于HashMap,由于android手机良莠不齐,因此开发过程当中对内存仍是很是重视的,能省则省。
PS:个人项目中基本使用的ArrayList,除非是ArrayList代替不了的数据结构
八、团队规范统一的第三方
如今方便又好用的第三方太多了,图片框架好几个优秀的,推送好几个优秀的,即时通信好几个优秀的。
注意使用太多的第三方会致使程序过大,并且应用有一个最大方法数的限制,避免实现一种功能的第三方,团队成员使用的都是不同的第三方。
九、统一代码格式
经典的就是for循环了, 一种是左括号放在最后,一个是另起一行。 统一下,界面看起来舒服,我的建议左括号放在最后的方式,别问我为啥,大学老师推荐的,理由:忘了。
for (int i = 0; i < 10; i++) { } for (int i = 0; i < 10; i++) { }
十、不一样功能代码之间要有一行空格分开
配合的写上注释,告诉维护的同窗 ,哪一段代码是进行什么操做的
为了代码清晰 也为了维护的同窗少长两根头发。。
十一、若是你是Android Studio开发
请频繁使用Ctrl+A --》 Ctrl +Alt + I
--------------------------------------------------------------------------------------------------------------------------
2、Android命名规范
命名规范:驼峰法,下划线分割法。
一、Java类文件
①、Activity:以Activity做为后缀,这个相信你们AS给你的都帮你作好了。
②、Adapter: 以Adapter做为后缀
③、ViewHolder: 以ViewHolder做为后缀
④、实体类Entity:以Entity做为后缀
以下,我是以功能模块分包,大神勿喷,我的喜爱:
二、xml文件
①、layout.xml
Activity的布局文件以activity_ 开头,AS提供的。
列表项的布局文件listview 以 item_list_开头。
②、控件的命名
缩写,这个看我的了,
个人经验,好比:
LayoutView ---- lv
TextView ---- tv
Button ---- btn
ImageView ---- img
切记,不要使用拼音命名,即便英文这么菜的博主我开发都开着有道词典。
最后,编码必定要写注释,你命名的若是英文不是立马能看懂的,请必定要写上注释。
注释!
注释!
注释!