总结Android规范(参考阿里规范, 仅用于公司内部)

栏目: Android · 发布时间: 4年前

内容简介:一份合格的代码不应只满足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于:这里梳理一下Android开发过程中需要注意的一些地方, 包括多个部分, 另外根据约束力强弱分为两类:下面是规范正文

一份合格的代码不应只满足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于:

  • 提升程序稳定性, 减少代码隐患, 降低故障率;
  • 增强可扩展性, 大幅提高维护效率;
  • 统一标准, 提升多人协作效率;
  • 方便新人快速上手, 在项目组人员发生变动时保证项目进度;

这里梳理一下Android开发过程中需要注意的一些地方, 包括多个部分, 另外根据约束力强弱分为两类:

  • 强制: 如果不遵守会导致代码严重混乱, 后期维护复杂, 甚至会出现严重bug;
  • 推荐: 如果不遵守可能会导致代码描述不清, 理解困难, 导致功能越多维护越难的问题;

下面是规范正文

系统架构相关

这一部分是项目总体上的要求, 包括 系统设计, 命名方式, 可见性, 注释, 代码风格 等几部分.

系统设计

强制

  1. 不允许出现两段相同的逻辑块, 必须抽出为公共方法, 差异性使用参数控制, 避免修改时多处修改导致遗漏;
  2. 不允许出现两段相同的处于同一逻辑组的复杂布局, 必须抽为单独的 include ;
  3. 不允许父类中出现子类具体方法, 如果需要的话可以父类定义抽象方法, 交由子类实现;
  4. 不允许 Activity 内多 Fragment 之间的直接沟通, 必须通过 Activity 中转;

推荐

  1. 推荐使用MVP或者MVVM架构;
  2. 推荐使用 Kotlin 语言;
  3. 采用模块分类方式替代文件类别方式, 方便快速查找模块相关内容, 例: LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter 等所属同一登录模块的文件放入一个文件夹, 而不是所有 activity 放入一个文件夹, 所有 adapter 放入一个文件夹.

命名方式

强制

LoginActivity.kt, NewsAdapter.kt, NewsBean.java
login_activity.xml, login_logo.png
class LoginPresenter {}, class NewsBean {}
LoginPresenter loginPresenter, NewsBean newsBean
public static final boolean IS_RELESAE = true
android:id="@+id/tvLogin"

推荐

  1. 文件/资源命名时采用 模块+类型 的方式, 以便迅速查找相关内容, 例如登录页面: LoginActivity.kt, login_activity.xml, login_logo.png, <string name="login_net_error">网络错误</string>, <color name="login_page_backgroud">#f3f3f3</color>

  2. java使用的布局中的id名建议使用小驼峰方式, 并且使用控件类型缩写开头, 例: android:id="@+id/tvLogin" , 附录常用控件缩写:

    控件 缩写
    LinearLayout ll
    RelativeLayout rl
    ConstraintLayout cl
    ListView lv
    ScollView sv
    TextView tv
    Button btn
    ImageView iv
    CheckBox cb
    RadioButton rb
    EditText et

可见性

强制

  1. 所有新定义的类/方法, 默认写成 private , 只有在其他类需要引用时再看情况标为 public, protected, package-private ;

推荐

  1. java定义的父类中定义的方法如果子类重写会导致问题时, 添加 final 关键字;

注释相关

强制

  1. 类/复杂或者不能从方法名字看出意图的方法必须添加注释, 当类/方法添加注释时, 必须使用此类型注释:
    /**
    * Created by XXX on 2019/6/19.
    * 描述此类作用, 逻辑复杂的说明一下主要思路
    */
    public class LoginPresenter {
        /**
        * 用于进行网络请求
        * @params xxx XXX
        */
        public void doLoginRequest(...){}
    }
    复制代码
  2. 变量注释不允许使用与类/方法一致的注释形式;
  3. 方法注释中不允许出现 @params, @return 的参数描述错误的情况, 必须实时更新;

推荐

/* */
@Nullable, @NotNull, @UiThread

代码风格

此git目录下同时存有 AndroidCodeStyleSetting.jar 配置文件, 用于AndroidStudio导入后按照统一风格进行代码的格式化.

如果没有编写代码时随时格式化代码的习惯, 可以在 AndroidStudio 版本控制提交窗口右侧 Before Commit 中勾选 Reformat code 选项.

Android具体模块相关

主要包括 基本组件, UI/布局, 进程/线程/消息推送, 文件/数据库, 图片/动画, 安全性等几个部分.

Android基本组件

强制

  1. Intent通信时不允许传递超过1M的数据, 可以采用外部Presenter中转或者EventBus传递的方式;
  2. Intent隐式启动时必须检查目标是否存在, 否则会出现目标未找到崩溃: if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ ONLY) != null) ;
  3. Activity/Service/BroadcastReceiver内如果有耗时操作, 必须采用多线程进行处理;
  4. 应用内部发送广播时, 只能使用 LocalBroadcastManager.getInstance(this).sendBroadcast(intent) , 不允许 context.sendBroadcast(intent) , 避免外部应用拦截;
  5. 不允许在 Application 中缓存数据, 全局的共享数据可以使用某 presenter 存储, 或者使用 SharedPreference 读写;
  6. Activity 或者 Fragment 中动态注册 BroadCastReceiver 时, registerReceiverunregisterReceiver 必须要成对出现;

推荐

  1. Activity#onPause/onStop 中结合 isFinishing 的判断来执行资源的释放, 必免放在执行时机较晚的 Activity#onDestroy() 中执行;
  2. 不要在 Activity#onPause 中执行耗时操作, 这样会导致界面跳转卡顿, 可以放入 Activity#onStop 中执行;

UI/布局

强制

  1. 布局xml优先使用 ConstraintLayout , 可以保证无嵌套的情况下完成包括部分控件同时显隐需求在内的99%的布局要求;
  2. 不允许使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew 等列表View, 复杂多项式列表可以使用多 ItemType 进行处理;

推荐

  1. Activity 中显示对话框或弹出浮层时, 尽量使用 DialogFragment , 而非 Dialog/AlertDialog , 便于随 Activity 生命周期管理弹窗的生命周期;

进程/线程/消息推送

强制

  1. 存在多进程的情况时, Application 中的初始化代码要根据进程分别处理, 避免初始化不必要的业务;
  2. 新建线程时, 必须通过线程池的方式, 不允许采用 new Thread() 的方式;
  3. Activity/Fragment 中使用 Handler 时, 必须使用静态内部类+WeakReferences方式或者在 onStop 中调用 handler.removeCallbacksAndMessages ;

推荐

  1. 多进程间共享数据使用 ContentProvider 替代 SharedPreferences#MODE_MULTI_PROCESS ;

文件/数据库

强制

  1. 使用系统API获取文件路径, 避免手拼字符串, 例: android.os.Environment#getExternalStorageDirectory(), Context#getFilesDir() , 错误示例: File file = new File("/mnt/sdcard/Download/Album", name) ;
  2. 当使用外部存储时, 必须检查外部存储的可用性: Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ;
  3. 数据库 Cursor 使用之后必须关闭, 以免内存泄漏;

推荐

  1. SharedPreference 仅存储简单数据类型, 不要存储复杂数据, 如json数据/Bitmap编码等;
  2. SharedPreference 提交数据时, 尽量使用 Editor#apply() , 而非 Editor#commit() ;

图片/动画

强制

  1. 加载大图时必须在子线程中处理, 否则会卡UI;
  2. Activity.onPause()/onStop() 中关闭当前 activity 正在执行的动画;

推荐

  1. Android图片建议转化为WebP格式, 可以减少APK体积;
  2. 动画尽量不要使用 AnimationDrawable , 占用非常多内存;
  3. 使用 ARGB_565 代替 ARGB_888 , 减少内存占用;
  4. Animation 执行结束时, 调用 View.clearAnimation() 释放相关资源;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Functional Programming in Scala

Functional Programming in Scala

Paul Chiusano、Rúnar Bjarnason / Softbound print / 2014-9-14 / USD 44.99

Functional programming (FP) is a programming style emphasizing functions that return consistent and predictable results regardless of a program's state. As a result, functional code is easier to test ......一起来看看 《Functional Programming in Scala》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具