浅谈Android编码规范及命名规范

前言:

  目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑。

  现大框架已经完成,正在进行细节模块上的开发

  抽空总结一下Android项目的开发规范:1、编码规范 2、命名规范  

  注:个人经验,经供参考

一、Android编码规范

  1、学会使用string.xml文件

  在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml

  比如一个保存按钮 , 不规范写法:

 <Button
  android:id="@+id/editinfo_btn_save"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="保存"
 />

这里给它的文本内容设置为"保存",那么一个app中所有的保存按钮都这样写。当有一天要修改需求了,要求把“保存”文字改成“提交”,那么我们只能去一个个布局文件中修改,

  岂不浪费大量时间又可能会存在漏掉修改的情况。

  规范写法:

 <Button
  android:id="@+id/editinfo_btn_save"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/save"
 />

而在string.xml文件中:

<string name="save">保存</string>

  这种写法,往后需要修改,只需要在string.xml文件中修改一行代码 便实现了整个APP的该文本内容修改。

  2、学会使用color.xml ,dimens.xml文件的使用

  同string.xml使用一致,同学们应该都懂的,切勿因为一时的懒,导致后期的迭代费时费力。

  3、团队协同确定一套标准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基类重写方法即可,涉及到架构,这个往后再说。

  4、团队协同确定一种控件的点击事件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;
 }
 }

    5、尽量少用全局变量static进行传值操作

    static的特性大家应该都是知道的,他会一直占用一部分内存,虽然很少,但是一个项目中成百上千个使用的话,对项目是非常不好的。

    建议页面之间的传值还是用Intent ,实现没有好的解决方案的再用static , PS ,我之前公司的项目就非常大量的使用了static

注:有些同学可能对Activity和Fragment的互相传值不大会,这里推荐一个解决方案:浅谈EventBus, 对我来说是项目必备,但是也要合理运用

 6、Activity中尽量不要使用内部类

    这里以RecyclerView举例,一款非常棒的控件,有了它再也不用ListView了 ,浅谈RecyclerView(完美替代ListView,GridView)

    一个RecyclerView是配套一个Adapter和一个ViewHolder的。

    不规范做法:部分同学图省事(当然放在一个Activity中确实方便数据传输和item点击事件操作),把它们都写在一个Activity中,这样是不可取的,因为大大的增加了单个Activity的代码量,对维护来说很不方便。

    规范做法: ViewHolder一个类 ,Adapter一个类 , 分工明确 ,避免一个类中代码量过多的问题。

    注:ListView,ViewPager 使用同上

    至于类的分类,有的同学喜欢一个功能模块放在一个包下,比如一个功能点的Activity , Adapter ,ViewHolder都放在一个包下

有的同学喜欢一种类的放在一个包下,比如将所有的Activity放在activitys包下,将所有的Adapter放在adapters包下。

    这都是后话,将来学习架构的时候再详谈

  7、使用ArrayList代替HashMap

     据说,是据说,ArrayList使用的内存要低于HashMap,因为android手机参差不齐,所以开发过程中对内存还是非常重视的,能省则省。

    PS:我的项目中基本使用的ArrayList,除非是ArrayList代替不了的数据结构

  8、团队规范统一的第三方

     现在方便又好用的第三方太多了,图片框架好几个优秀的,推送好几个优秀的,即时通讯好几个优秀的。

     注意使用太多的第三方会导致程序过大,而且应用有一个最大方法数的限制,避免实现一种功能的第三方,团队成员使用的都是不一样的第三方。

  9、统一代码格式

    经典的就是for循环了, 一种是左括号放在最后,一个是另起一行。 统一下,界面看起来舒服,个人建议左括号放在最后的方式,别问我为啥,大学老师推荐的,理由:忘了。

 for (int i = 0; i < 10; i++) {
 }
 for (int i = 0; i < 10; i++)
 {
 }

10、不同功能代码之间要有一行空格分开

    配合的写上注释,告诉维护的同学 ,哪一段代码是进行什么操作的

    为了代码清晰 也为了维护的同学少长两根头发。。

  11、如果你是Android Studio开发

    请频繁使用Ctrl+A  --》  Ctrl +Alt + I

--------------------------------------------------------------------------------------------------------------------------

二、Android命名规范

  命名规范:驼峰法,下划线分割法。

  1、Java类文件

  ①、Activity:以Activity作为后缀,这个相信大家AS给你的都帮你做好了。

  ②、Adapter: 以Adapter作为后缀

  ③、ViewHolder: 以ViewHolder作为后缀

  ④、实体类Entity:以Entity作为后缀

  如下,我是以功能模块分包,大神勿喷,个人喜好:

     2、xml文件

  ①、layout.xml

    Activity的布局文件以activity_ 开头,AS提供的。

    列表项的布局文件listview  以 item_list_开头。

  ②、控件的命名

    缩写,这个看个人了,

    我的经验,比如:

    LayoutView    ----    lv

    TextView        ----    tv

Button          ----    btn

    ImageView     ----    img

  切记,不要使用拼音命名,即使英文这么菜的博主我开发都开着有道词典。

  最后,编码一定要写注释,你命名的如果英文不是立马能看懂的,请一定要写上注释。

(0)

相关推荐

  • Android资源命名规范 分享

    Android资源命名规范最近几个月,大量涉及android资源的相关工作.对于复杂的应用而言,资源命名的规范很有必要.除了开发人员之外,UI设计人员(或者切图相关人员)也需要对资源使用的位置非常清楚,这样,沟通就会直接.缺点是资源名字长一些,但是从整体价值来看,值得.命名模板为:缩写_主界面_功能部分(一) 缩写:ic ----------------------iconbg---------------------backgrounddi----------------------divid

  • android POST数据遇到的UTF-8编码(乱码)问题解决办法

    今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常.服务器端确认是编码转换错误.于是截取网络数据包进行分析,发现客户端POST的json数据中包含下面一段(hex形式): 复制代码 代码如下: ... 61 64 20 b7 20 52 69 63 ... 问题就出在这个b7上.查阅Unicode代码表后发现,U+00b7是MIDDLE DOT,它的UTF-8表现形式应该是c2 b7,但为何客户端发送的数据中它变成了b7? 由于系统使用了ormlite.gson和a

  • Android数据加密之Base64编码算法的简单实现

    前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算法,为何要使用Base64编码呢?它解决了什么问题?这也是本文探讨的东西? 什么Base64算法? Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64并不是安全领域的加密算法,其实Base64只能算是一个编码算法,对数据内容进行编码来适合传输.标准Base64编码解码无需额外信

  • 浅谈Android开发中项目的文件结构及规范化部署建议

    一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

  • 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 2.命名规范 注:个人经验,经供参考 一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Button android:id="@+id/editinfo_b

  • 浅谈Android解决65535问题的方法

    Error:Error converting bytecode to dex: Cause: com.android.dex.DexIndexOverflowException: Cannot merge new index 66125 into a non-jumbo instruction! Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16位,即65536个.dex里方法只能索引65536个 因为项

  • 浅谈android @id和@+id的区别

    今天,简单讲讲android里关于@id和@+id的区别. 之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别.于是就在网上查找资料,最终是解决了问题.这里记录一下. Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值.id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等. 如果在@后面使用"+",表示当修改完某个布局文件并保存后,系统会自动在R.

  • 浅谈Android安全风险与防范措施

    做好的apk文件,被检测工具检测出一大堆风险问题,是不是感觉自己的付出白费了,今天咱就聊聊android的安全防范问题. 一,先说安全检查方面的吧 1,源文件安全问题方面 1.1篡改和二次打包风险 1.2应用签名未校验风险 1.3Java代码反编译风险检测 1.4代码未混淆风险检测 1.5资源文件泄露风险检测 2,数据存储安全问题方面 2.1 WebView明文存储密码风险检测 2.2Internal Storage数据全局可读写风险检测 3.3加密算法不安全使用风险 4.4日志数据泄露风险 4

  • 浅谈Android ANR的信息收集过程

    目录 一. ANR场景 二. appNotResponding处理流程 三. 总结 一. ANR场景 无论是四大组件或者进程等只要发生ANR,最终都会调用AMS.appNotResponding()方法,下面从这个方法说起. 以下场景都会触发调用AMS.appNotResponding方法: Service Timeout:比如前台服务在20s内未执行完成: BroadcastQueue Timeout:比如前台广播在10s内未执行完成 InputDispatching Timeout: 输入事

  • 浅谈Android串口通讯SerialPort原理

    目录 前言 一.名词解释 二.SerialPort的函数分析 三.SerialPort打开串口的流程 四.疑惑 五.总结 前言 通过前面这篇文章Android串口通讯SerialPort的使用详情已经基本掌握了串口的使用,那么不经想问自己,到底什么才是串口通讯呢?串口通讯(Serial Communication),设备与设备之间,通过输入线(RXD),输出线(TXD),地线(GND),按位进行传输数据的一种通讯方式.CPU 和串行设备间的编码转换器(转换器(converter)是指将一种信号转

  • 浅谈android中数据库的拷贝

    SQLiteDatabase不支持直接从assets读取文件,所以要提前拷贝数据库.在读取数据库时,先在项目中建立assets文件夹用于存放外部文件,将数据库文件拷到该目录下. 代码方法: /** * 拷贝数据库至file文件夹下 * @param dbName 数据库名称 */ private void initAddressDB(String dbName) { //1,在files文件夹下创建同名dbName数据库文件过程 File files=getFilesDir();//获取/dat

  • 浅谈Android Activity与Service的交互方式

    实现更新下载进度的功能 1. 通过广播交互 Server端将目前的下载进度,通过广播的方式发送出来,Client端注册此广播的监听器,当获取到该广播后,将广播中当前的下载进度解析出来并更新到界面上. 优缺点分析: 通过广播的方式实现Activity与Service的交互操作简单且容易实现,可以胜任简单级的应用.但缺点也十分明显,发送广播受到系统制约.系统会优先发送系统级广播,在某些特定的情况下,我们自定义的广播可能会延迟.同时在广播接收器中不能处理长耗时操作,否则系统会出现ANR即应用程序无响应

  • 浅谈android获取设备唯一标识完美解决方案

    本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

    前言: 其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方.就几个,可能还没用到其他的精髓. 但我觉的这个两个功能对我是比较实用的.好那么下面就给大家介绍一下吧. 正文: 话不多说咱们直接上图吧.(个人比较喜欢看图说话) 第一个(Android Profiler)我要介绍的就是这个了.(先看一下效果"震撼一下") (图-1) (图-2) (图-3) (厉害不厉害,牛逼不牛逼)那么我们怎么来操作这个工具呢,来咱们接着看图

随机推荐