内容简介:一份合格的代码不应只满足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于:这里梳理一下Android开发过程中需要注意的一些地方, 包括多个部分, 另外根据约束力强弱分为两类:下面是规范正文
一份合格的代码不应只满足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于:
- 提升程序稳定性, 减少代码隐患, 降低故障率;
- 增强可扩展性, 大幅提高维护效率;
- 统一标准, 提升多人协作效率;
- 方便新人快速上手, 在项目组人员发生变动时保证项目进度;
这里梳理一下Android开发过程中需要注意的一些地方, 包括多个部分, 另外根据约束力强弱分为两类:
- 强制: 如果不遵守会导致代码严重混乱, 后期维护复杂, 甚至会出现严重bug;
- 推荐: 如果不遵守可能会导致代码描述不清, 理解困难, 导致功能越多维护越难的问题;
下面是规范正文
系统架构相关
这一部分是项目总体上的要求, 包括 系统设计, 命名方式, 可见性, 注释, 代码风格 等几部分.
系统设计
强制
- 不允许出现两段相同的逻辑块, 必须抽出为公共方法, 差异性使用参数控制, 避免修改时多处修改导致遗漏;
-
不允许出现两段相同的处于同一逻辑组的复杂布局, 必须抽为单独的
include
; - 不允许父类中出现子类具体方法, 如果需要的话可以父类定义抽象方法, 交由子类实现;
-
不允许
Activity
内多Fragment
之间的直接沟通, 必须通过Activity
中转;
推荐
- 推荐使用MVP或者MVVM架构;
-
推荐使用
Kotlin
语言; -
采用模块分类方式替代文件类别方式, 方便快速查找模块相关内容, 例:
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"
推荐
-
文件/资源命名时采用 模块+类型 的方式, 以便迅速查找相关内容, 例如登录页面:
LoginActivity.kt, login_activity.xml, login_logo.png, <string name="login_net_error">网络错误</string>, <color name="login_page_backgroud">#f3f3f3</color>
-
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
可见性
强制
-
所有新定义的类/方法, 默认写成
private
, 只有在其他类需要引用时再看情况标为public, protected, package-private
;
推荐
-
java定义的父类中定义的方法如果子类重写会导致问题时, 添加
final
关键字;
注释相关
强制
-
类/复杂或者不能从方法名字看出意图的方法必须添加注释, 当类/方法添加注释时, 必须使用此类型注释:
/** * Created by XXX on 2019/6/19. * 描述此类作用, 逻辑复杂的说明一下主要思路 */ public class LoginPresenter { /** * 用于进行网络请求 * @params xxx XXX */ public void doLoginRequest(...){} } 复制代码
- 变量注释不允许使用与类/方法一致的注释形式;
-
方法注释中不允许出现
@params, @return
的参数描述错误的情况, 必须实时更新;
推荐
/* */ @Nullable, @NotNull, @UiThread
代码风格
此git目录下同时存有 AndroidCodeStyleSetting.jar
配置文件, 用于AndroidStudio导入后按照统一风格进行代码的格式化.
如果没有编写代码时随时格式化代码的习惯, 可以在 AndroidStudio
版本控制提交窗口右侧 Before Commit
中勾选 Reformat code
选项.
Android具体模块相关
主要包括 基本组件, UI/布局, 进程/线程/消息推送, 文件/数据库, 图片/动画, 安全性等几个部分.
Android基本组件
强制
- Intent通信时不允许传递超过1M的数据, 可以采用外部Presenter中转或者EventBus传递的方式;
-
Intent隐式启动时必须检查目标是否存在, 否则会出现目标未找到崩溃:
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ ONLY) != null)
; - Activity/Service/BroadcastReceiver内如果有耗时操作, 必须采用多线程进行处理;
-
应用内部发送广播时, 只能使用
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
, 不允许context.sendBroadcast(intent)
, 避免外部应用拦截; -
不允许在
Application
中缓存数据, 全局的共享数据可以使用某presenter
存储, 或者使用SharedPreference
读写; -
Activity
或者Fragment
中动态注册BroadCastReceiver
时,registerReceiver
和unregisterReceiver
必须要成对出现;
推荐
-
Activity#onPause/onStop
中结合isFinishing
的判断来执行资源的释放, 必免放在执行时机较晚的Activity#onDestroy()
中执行; -
不要在
Activity#onPause
中执行耗时操作, 这样会导致界面跳转卡顿, 可以放入Activity#onStop
中执行;
UI/布局
强制
-
布局xml优先使用
ConstraintLayout
, 可以保证无嵌套的情况下完成包括部分控件同时显隐需求在内的99%的布局要求; -
不允许使用
ScrollView
包裹ListView/GridView/ExpandableListVIew
等列表View, 复杂多项式列表可以使用多ItemType
进行处理;
推荐
-
在
Activity
中显示对话框或弹出浮层时, 尽量使用DialogFragment
, 而非Dialog/AlertDialog
, 便于随Activity
生命周期管理弹窗的生命周期;
进程/线程/消息推送
强制
-
存在多进程的情况时,
Application
中的初始化代码要根据进程分别处理, 避免初始化不必要的业务; -
新建线程时, 必须通过线程池的方式, 不允许采用
new Thread()
的方式; -
Activity/Fragment
中使用Handler
时, 必须使用静态内部类+WeakReferences方式或者在onStop
中调用handler.removeCallbacksAndMessages
;
推荐
-
多进程间共享数据使用
ContentProvider
替代SharedPreferences#MODE_MULTI_PROCESS
;
文件/数据库
强制
-
使用系统API获取文件路径, 避免手拼字符串, 例:
android.os.Environment#getExternalStorageDirectory(), Context#getFilesDir()
, 错误示例:File file = new File("/mnt/sdcard/Download/Album", name)
; -
当使用外部存储时, 必须检查外部存储的可用性:
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
; -
数据库
Cursor
使用之后必须关闭, 以免内存泄漏;
推荐
-
SharedPreference
仅存储简单数据类型, 不要存储复杂数据, 如json数据/Bitmap编码等; -
SharedPreference
提交数据时, 尽量使用Editor#apply()
, 而非Editor#commit()
;
图片/动画
强制
- 加载大图时必须在子线程中处理, 否则会卡UI;
-
在
Activity.onPause()/onStop()
中关闭当前activity
正在执行的动画;
推荐
- Android图片建议转化为WebP格式, 可以减少APK体积;
-
动画尽量不要使用
AnimationDrawable
, 占用非常多内存; -
使用
ARGB_565
代替ARGB_888
, 减少内存占用; -
当
Animation
执行结束时, 调用View.clearAnimation()
释放相关资源;
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [Vue 2.x Todo 教程练习参考答案] 标为完成练习参考答案
- [Vue 2.x Todo 教程练习参考答案] 添加todo练习参考答案
- MyOIDC v1.1.0 发布,基于 OIDC 协议的参考实现,根据各类库提供实现参考
- [Vue 2.x Todo 教程练习参考答案] 入门仪式_Hello_Vue练习参考答案
- 微服务参考架构实现
- 领域驱动设计参考
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First 设计模式(中文版)
弗里曼 / O'Reilly Taiwan公司 / 中国电力出版社 / 2007-9 / 98.00元
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、I......一起来看看 《Head First 设计模式(中文版)》 这本书的介绍吧!