Android开发规范自用简单版

一、命名规范

1. 项目名

(1) App 项目以产品对应英文命名,例:

教学中⼼ TeachingCenter

(2) 模块以 模块名 命名,例:

公共模块 common
用户模块 user

(3) 组件以 library- + 组件 命名,例:

公共组件 library-common
日历组件 library-calendar

2. 类名

采⽤⼤驼峰命名规范,尽量避免缩写,除非该缩写是众所周知的, 比如 URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

描述 例如
Activity Activity 为后缀标识 欢迎页面类 WelcomeActivity
Adapter Adapter 为后缀标识 公告详情适配器 AnnouncementAdapter
工具方法类 UtilsManager 为后缀标识 线程池管理类:ThreadPoolManager
日志工具类:LogUtilsLogger 也可)
打印工具类:PrinterUtils
数据库类 DBHelper 后缀标识 信息数据库:InfosDBHelper
Service Service 为后缀标识 时间服务 TimeService
BroadcastReceiver Receiver 为后缀标识 推送接收 JPushReceiver
ContentProvider Provider 为后缀标识 ShareProvider
自定义的共享基础类 Base 开头 BaseActivity, BaseFragment

3. 接口(interface)

命名规则与类一样采用大驼峰命名法,但必须冠以前缀I ,比如ISomeInterface,接口的实现 类则是去掉前缀I但添加后缀Impl,比如SomeInterfaceImpl

注意:如果项目采用 MVP,所有 Model、View、Presenter 的接口都以 I 为前缀,不加后缀,其他的接口采用上述命名规则。

4. 方法名

方法名都以 lowerCamelCase 风格编写。

方法 说明
initXX() 初始化相关方法,使用 init 为前缀标识,如初始化布局 initView()
isXX(), checkXX() 方法返回值为 boolean 型的请使用 is/check 为前缀标识
getXX() 返回某个值的方法,使用 get 为前缀标识
setXX() 设置某个属性值
handleXX(), processXX() 对数据进行处理的方法
displayXX(), showXX() 弹出提示框和提示信息,使用 display/show 为前缀标识
updateXX() 更新数据
saveXX(), insertXX() 保存或插入数据
resetXX() 重置数据
clearXX() 清除数据
removeXX(), deleteXX() 移除数据或者视图等,如 removeView()
drawXX() 绘制数据或效果相关的,使用 draw 前缀标识

5. 常量

常量名全部大写字母,单词间以下划线分割,如:CONSTANT_VALUE_A

6. 控件

为了更好地区分 UI 控件和普通成员变量,所有用来表示控件的成员变量统一加上控件缩写作为前缀。

名称 缩写
Button btn
CheckBox cb
EditText et
FrameLayout fl
GridView gv
ImageButton ib
ImageView iv
LinearLayout ll
ListView lv
ProgressBar pb
RadioButtion rb
RecyclerView rv
RelativeLayout rl
ScrollView sv
SeekBar sb
Spinner spn
TextView tv
ToggleButton tb
VideoView vv
WebView wv

7. 数据类型

对于表示集合或者数组的非常量字段名,我们可以添加后缀来增强字段的可读性,比如:
集合添加如下后缀:List、Map、Set。
数组添加如下后缀:Arr。
例如:userListuserArrfirstNameSet

8. 资源文件

资源文件命名为全部小写,采用下划线命名法。

如果是组件化开发,可以在组件和公共模块间创建一个 ui 模块来专门存放资源文件,然后让每个组件都依赖 ui 模块。这样做的好处是如果老项目要实现组件化的话,只需把资源文件都放入 ui 模块即可。

8.1 动画资源文件(anim/ 和 animator/)

安卓主要包含属性动画和视图动画,其视图动画包括补间动画和逐帧动画。属性动画文件需要放在 res/animator/ 目录下,视图动画文件需放在 res/anim/ 目录下。

命名规则:{模块名_}逻辑名称
说明:{} 中的内容为可选,逻辑名称 可由多个单词加下划线组成。如:
activity_bottom_in.xmlactivity_top_out.xml

8.2 图片资源文件

res/drawable/ 目录下放的是位图文件(.png、.9.png、.jpg、.gif)或编译为可绘制对象资源子类型的 XML 文件,而 res/mipmap/ 目录下放的是不同密度的启动图标,所以 res/mipmap/ 只用于存放启动图标,其余图片资源文件都应该放到 res/drawable/ 目录下。
命名规则:类型{_模块名}_逻辑名称类型{_模块名}_颜色{} 内容可选)。例如:
btn_red.pngbg_input.pngdivider_white.png

8.3 布局资源文件(layout/)

命名规则:类型_模块名类型{_模块名}_逻辑名称
例如:
activity_main.xml fragment_live_list.xml

二、编码规范

1. 类成员顺序

推荐使用如下排序:

  1. 常量
  2. 字段
  3. 构造函数
  4. 重写函数和回调
  5. 公有函数
  6. 私有函数
  7. 内部类或接口
    例如:
class MainActivity : Activity() {

    val TAG: String = this.javaClass.simpleName

    private var mTitle: String = ""
    private lateinit var mTextViewTitle: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    private fun setTitle(title: String) {
        mTitle = title
    }

    private fun setUpView() {
    }

    inner class AnInnerClass {

    }
}

2. 编写简短方法

在可行的情况下,尽量编写短小精炼的方法。如果某个方法的代码超出 40 行,请考虑是否可以在不破坏程序结构的前提下对其拆解。

3. 键值对字符串常量

针对常用的键值对函数,比如 SharedPreferencesBundleIntent等,请参考以下规则:

字段名前缀
SharedPreferences PREF_
Bundle BUNDLE_
Fragment Arguments ARGUMENT_
Intent Extra EXTRA_
Intent Action ACTION_
例如:
 companion object{
        // 注意:字段的值与名称相同以避免重复问题
        const val PREF_EMAIL = "PREF_EMAIL"
        const val BUNDLE_AGE = "BUNDLE_AGE"
        const val ARGUMENT_USER_ID = "ARGUMENT_USER_ID"

        // 与意图相关的项使用完整的包名作为值的前缀
        const val EXTRA_SURNAME = "com.myapp.extras.EXTRA_SURNAME"
        const val ACTION_OPEN_USER = "com.myapp.action.ACTION_OPEN_USER"
    }

4. 换行

4.1 操作符换行

除赋值操作符之外,我们把换行符放在操作符之前,例如:

val longName = anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne
        + theFinalOne;

赋值操作符的换行我们放在其后,例如:

val longName =
        anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne + theFinalOne;

4.2 函数链的换行

当同一行中调用多个函数时(比如使用构建器时),对每个函数的调用应该在新的一行中,我们把换行符插入在 . 之前。

例如:

Glide.with(context)
        .load("https://blankj.com/images/avatar.jpg")
        .into(ivAvatar);

4.3 RxJava 链式的换行

RxJava 的每个操作符都需要换新行,并且把换行符插入在 . 之前。

例如:

    fun doSomething() {
        ApiManager.getInstance().liveVideoService
                .updateApplyStatus(url, liveKey, applyStatus)
                .compose(RxHelper.defalutHandleResult<Any>())
                .subscribe(object : RxSubscriber<Any>(this) {
                    override fun _onNext(t: Any?) {
                    }

                    override fun _onError(message: String?) {
                    }
                })
    }

三、注释

1. 类注释

/**
 *     author : dell
 *     time   : 2022/08/24
 *     desc   : 欢迎页面
 */
class WelcomeActivity : Activity() {
}

2. 方法注释

   /**
     * bitmap 转 byteArr
     *
     * @param bitmap bitmap 对象
     * @param format 格式
     * @return 字节数组
     */
    fun bitmap2Bytes(bitmap: Bitmap?, format: Bitmap.CompressFormat?): ByteArray? {
        if (bitmap == null) return null
        val baos = ByteArrayOutputStream()
        bitmap.compress(format, 100, baos)
        return baos.toByteArray()
    }

3. 其他注释

        // TODO: 2022/8/24  待处理
        // FIXME: 2022/8/24 待修复

四、版本统一规范

Android 开发存在着众多版本的不同,比如 compileSdkVersion、minSdkVersion、targetSdkVersion 以及项目中依赖第三方库的版本,不同的 module 及不同的开发人员都有不同的版本,所以需要一个统一版本规范的文件。如:

ext {
    // Sdk and tools
    compile_sdk_version = 29
    build_tools_version = '29.0.2'
    min_sdk_version = 22
    target_sdk_version = 29

    version_code = 10
    version_name = '1.0.0'

    // App dependencies
    support_version = '26.1.0'

    leakcanary_version = '1.5.4'
}

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...