###  前言

1.  Android Studio尽量保持最新
2.  删除无用import 
3.  编辑完代码需要格式化

### Android命名规范

> 代码中的命名严禁使用拼音与英文混合的方式，更不允许直接使用中文的方式

1. 包名

   包名全部小写，不允许出现"中文"、"大写字母"或者"下划线"，按"功能名称"命名,哪块要添加新功能，只需要改动某一package下的东西（ps 订单管理就只取创建一个orderManager包名，剩下的逻辑全写在里面）

2. 类名

   类名都以 UpperCamelCase 风格编写。

   >  大驼峰命名法 ，首字母及后面的每个词的首字母都大写
   >
   > Ps: PersonActivity

   | 类                  | 描述                              | 举例                             |
   | ------------------- | --------------------------------- | -------------------------------- |
   | Activity类          | 功能名加 + Activity               |                                  |
   | Fragment类          | 功能名 + Fragment                 | 主页类 HomeFragment              |
   | Service类           | 功能名+Service                    | 时间服务 TimeService             |
   | BroadcastReceiver类 | 功能名 + Receiver                 | 推送接收 JPushReceiver           |
   | ContentProvider类   | 功能名 + Provider                 | ShareProvider                    |
   | 自定义 View         | 功能名 + View/ViewGroup(组件名称) | 如继承已有控件 ps ShapeButton，  |
   | Dialog对话框        | 功能名+Dialog                     | LoginDialog                      |
   | Adapter 类          | 功能名 + Adapter                  | OrderDetailAdapter               |
   | 工具方法类          | 功能名 + Utils 或 Manager         | 打印工具类：PrinterUtils         |
   | 自定义的共享基础类  | Base + 基础                       | Base + 基础                      |
   | 抽象类              | Base / Abstract 开头+功能名       | AbstractLogin                    |
   | 异常类              | Exception 结尾                    | GsonParseExecption               |
   | 接口类              | able / ible 结尾 / I 开头         | Runnable, Accessible，ILoginView |

   

3. 方法

   > - 方法名都以 `lowerCamelCase` (小驼峰命名法) 风格编写
   >
   > | 用途                                 | 说明                         | 举例                            |
   > | ------------------------------------ | ---------------------------- | ------------------------------- |
   > | 初始化相关方法，使用 init 为前缀标识 | 初始化相关操作以init作为前缀 | initView,initData               |
   > | 返回boolean的方法                    | 以is/check作为前缀           | isPhoneNumber                   |
   > | 返回某个值的方法                     | 使用get作为前缀              | getName()                       |
   > | 设置属性                             | 使用set作为前缀              | setName()                       |
   > | 处理相关的操作                       | 使用handle/precess作为前缀， | handleMessage,processTouchEvent |
   > | 弹出提示框和提示信息                 | 使用 display/show 为前缀标识 | displayXX()`, `showXX()         |
   > | 更新数据                             | updateXX()                   | -                               |
   > | 保存或插入数据                       | saveXX()`, `insertXX()       | -                               |
   > | 重置数据                             | resetXX()                    |                                 |
   > | 清除数据                             | clearXX()                    |                                 |
   > | 移除数据或者视图                     | removeXX()`, `deleteXX()     |                                 |
   > | 绘制数据或效果相关的                 | drawXX()                     |                                 |
   >
   > - 方法参数的命名
   >
   >   - 方法参数 要把常用的参数放在前面 ,可为null的参数放在后面
   >
   >     ```kotlin
   >     class MyView(private mContext:Context，callback:Callback?=null)
   >     	
   >     ```
   >
   > - 方法的调用
   >
   >   - 多参数的方法调用要确保每个,后面进行换行
   >
   >     ```java
   >     loadPicture(context,
   >             "https://blankj.com/images/avatar.jpg",
   >             ivAvatar,
   >             "Avatar of the user",
   >             clickListener);
   >     ```
   >
   >     

4. 变量命令

   - 禁止使用中文或者中文拼音进行命名

     >  tuikuanAmount dianpuId  

   - 使用驼峰命名风格 (单词控制在三个以内)

   - 局部变量或者公开的成员变量要以作用来命名

     ```java
     public String name;
     public TextView nameView;
     public FrameLayout nameLayout;
     ```

   - 非公开的成员变量要以小写m开头 

     ```java
     private String mName;
     private TextView mNameView;
     private FrameLayout mNameLayout;
     ```

   - 布尔值命名规范，无论是局部变量还是成员变量，都不要带“is"

   ```java
   // 不规范写法示例
   private boolean mIsDebug;
   boolean isDebug;
   
   // 规范写法示例
   private boolean mDebug;
   boolean debug;
   ```

   - 静态变量用小写s开头

     ```java
     static Handler sHandler;
     ```

   - 常量则需要用大写，并且用下划线代替驼峰，例如：

     ```java
     static final String REQUEST_INSTALL_PACKAGES;	
     ```

5. 资源命名

   1. 动画命名(anim/ 和 animator/)

      > 属性动画文件需要放在 `res/animator/` 目录下，视图动画文件需放在 `res/anim/` 目录下

      - 命名规则

        > 用 {模块名_}逻辑名称   ps:  refresh_progress.xml`、`market_cart_add.xml`、`market_cart_remove.xml     

   2. 颜色命令（color/）

      > 暂时以 color_颜色  ps   color_fff

   3. 图片资源命名（drawable/ 和 mipmap/）

      > - 如果是业务模块下的资源,以 **模块 + 类型**命名  
      >
      > ```xml
      > share_link_ic.png（复制链接）
      > 
      > share_moment_ic.png（分享到朋友圈）
      > 
      > share_qq_ic.png（分享到 QQ 好友）
      > 
      > share_qzone_ic.png（分享到 QQ 空间）
      > 
      > share_wechat_ic.png（分享到微信好友）
      > ```
      >
      > - 如果和业务模块不相干的资源，以 **作用 + 类型** 来命名
      >
      >   ```xml
      >   button_rect_selector.xml（通用直角按钮样式）
      >   
      >   button_round_selector.xml（通用圆角按钮样式）	
      >   ```
      >
      >  后缀命名  
      >
      > | 名称     | 类型   |
      > | -------- | ------ |
      > | Ic       | 图标   |
      > | bg       | 背景   |
      > | Selector | 选择器 |
      >
      > 

   4. 布局命名

      - 以 **模块 + 类型** 来命名，例如：

        ```xml
        home_activity.xml
        
        setting_fragment.xml
        
        menu_item.xml
        
        address_dialog.xml
        ```

   5. 布局id命名

      - 应该以 **控件的缩写 + 模块名 + 作用** 来命名，例如

        ```xml
        @+id/R.id.rg_login_type
        
        @+id/R.id.et_login_phone
        
        @+id/R.id.et_login_sms
        
        @+id/R.id.et_login_password
        
        @+id/R.id.btn_login_commit
        ```

        - View 和 Layout 控件缩写表，这里列举最常见的几个

        | 名称           | 缩写 |
        | -------------- | ---- |
        | TextView       | tv   |
        | EditText       | et   |
        | Button         | btn  |
        | ImageView      | iv   |
        | ImageButton    | ib   |
        | ListView       | lv   |
        | RecyclerView   | rv   |
        | RadioButton    | rb   |
        | RadioGroup     | rg   |
        | ProgressBar    | pb   |
        | CheckBox       | cb   |
        | TableLayout    | tl   |
        | ScrollView     | sv   |
        | LinearLayout   | ll   |
        | RelativeLayout | rl   |
        | FrameLayout    | fl   |

   6. strings.xml命名

      - **模块 + 功能** 来命名，例如：

        ```xml
        <!-- 主界面 -->
        <string name="home_nav_index">首页</string>
        <string name="home_nav_found">发现</string>
        <string name="home_nav_message">消息</string>
        <string name="home_nav_me">我的</string>
        <string name="home_exit_hint">再按一次退出</string>
        
        <!-- 登录界面 -->
        <string name="login_register">注册</string>
        <string name="login_phone_hint">请输入手机号</string>
        <string name="login_password_hint">请输入密码</string>
        <string name="login_forget">忘记密码？</string>
        <string name="login_text">登录</string>
        <string name="login_other">其他登录方式</string>
        
        <!-- 注册界面 -->
        <string name="register_title">注册</string>
        <string name="register_hint">手机号仅用于登录和保护账号安全</string>
        <string name="register_login">登录</string>
        <string name="register_password_hint1">设置密码</string>
        <string name="register_password_hint2">再次输入密码</string>
        <string name="register_password_input_error">两次密码输入不一致，请重新输入</string>
        
        <!-- 设置界面 -->
        <string name="setting_title">设置</string>
        <string name="setting_language_switchover">语言切换</string>
        <string name="setting_language_simple">简体中文</string>
        <string name="setting_language_complex">繁体中文</string>
        ```

   7. styles.xml命名

      - 如果只是主题相关的样式，以 **Theme** 命名结尾，控件样式则以 **Style** 命名结尾，命名要求尽量简洁，并且需要有代码注释，示例如下：

        ```xml
        <!-- 应用主题样式 -->
        <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
            .....
        </style>
        
        <!-- 全屏主题样式 -->
        <style name="FullScreenTheme" parent="AppTheme">
            .....
        </style>
        
        <!-- 闪屏页主题样式 -->
        <style name="SplashTheme" parent="FullScreenTheme">
            .....
        </style>
        <!-- 默认圆角按钮样式 -->
        <style name="ButtonStyle" parent="Widget.AppCompat.Button.Borderless">
            .....
        </style>
        
        <!-- 不带圆角按钮样式 -->
        <style name="RectButtonStyle" parent="ButtonStyle">
            .....
        </style>
        
        <!-- 默认文本框样式 -->
        <style name="EditTextStyle">
            .....
        </style>
        
        <!-- 验证码按钮样式 -->
        <style name="CountdownViewStyle">
            .....
        </style>
        ```

   ### Android注释命名

   1. 类注释

      > 类注释规范：需要表示出作者，时间，描述，文档地址等

   2. 方法注释

      > 需要标明 方法作用，参数含义，文档地址等

   3. 变量注释

      > 如果变量名写的已经很明显了，可以不需要写注释，反之则需要注明用处

   4. 注释必须遵守的规范
      1. 通过方法名就可以知道的命名不需要
      2. 最新发布不应该出现 Todo注释
