Android 开发规范

来源:互联网 发布:软件著作权律师 编辑:程序博客网 时间:2024/06/05 17:55

Android开发规范———————————1.0

created by JiaJie 2017.7.24

目录

      • Android开发规范10
            • created by JiaJie 2017724
  • 目录
      • 1IDE选择规范
      • 2版本统一规范
      • 3第三方库规范
      • 4命名规范
        • 1包名
        • 2类名
        • 3方法名
        • 4常量名
        • 5非常量字段名
        • 6参数名
        • 7局部变量名
        • 8临时变量名
        • 9类型变量名
      • 5资源文件规范
        • 1资源文件XMLlayout
          • 11 contentView命名
          • 12 Dialog命名
          • 13 PopupWindow命名
          • 14 列表项命名
          • 15 包含项命名
        • 2资源文件XMLdrawable
        • 3资源文件XMLanim
        • 4资源文件XMLvalues 中name的命名
          • 41 colors
          • 42 dimens
          • 43 strings
          • 44 styles
        • 5layout中的id命名
      • 6注释规范后面补齐
        • 1类注释
        • 2方法注释
        • 3块注释
        • 4其他代码注释
      • 7其他规范
  • 附录
      • UI控件缩写表
      • 常见的英文单词缩写表

1、IDE选择规范

  • IDE选择Android studio 2.2版本以上。
  • 编码格式统一UTF-8
  • 删除多余的import,并且减少警告出现。

2、版本统一规范

  • compileSdkVersion
  • minSdkVersion
  • targetSdkVersion
  • 项目中依赖的三方库
  • 不同的module

注:在工程最外层build.gridle文件中进行版本统一管理

3、第三方库规范

  • 统一第三方库版本,尽量由一人来操作依赖。

4、命名规范

代码中的命名严禁使用拼音与英文回合的方式,更不允许直接使用中文。正确的英文拼写和语法可以让读者易于阅读和理解,避免歧义。

注:即使纯拼音命名方式也要避免采用。但alibaba、taobao、youku、hangzhou等国际通用的名称,可视同英文。

4.1包名

包名全部小写,连续的单词只是简单地连接起来,不使用下划线,采用反域名命名规则,全部使用小写字母。一级包名是顶级域名,通常为com,edu,gov,net,org等,二级包名为公司名,三级包名根据应用进行命名,后面就是对包名的划分了,关于包名的划分,推荐使用按功能分。
以下是Google官方提供的包结构
java
└─com
└─google
└─samples
└─apps
└─iosched
│ AppApplication.java 定义Application类
│ Config.java 定义配置数据(常量)

├─about
│ AboutActivity.java

├─appwidget
│ ScheduleWidgetProvider.java
│ ScheduleWidgetRemoteViewsService.java

├─debug
│ │ DebugAction.java
│ │ DebugActivity.java
│ │ DebugFragment.java
│ │
│ └─actions
│ DisplayUserDataDebugAction.java
│ ForceAppDataSyncNowAction.java
│ ForceSyncNowAction.java
│ …

├─explore
│ │ ExploreIOActivity.java
│ │ ExploreIOFragment.java
│ │ ExploreModel.java
│ │ …
│ │
│ └─data
│ ItemGroup.java
│ LiveStreamData.java
│ MessageData.java
│ …

├─feedback
│ FeedbackApiHelper.java
│ FeedbackConstants.java
│ FeedbackHelper.java
│ …

├─framework
│ FragmentListener.java
│ LoaderIdlingResource.java
│ Model.java
│ …定义interface并实现

├─gcm
│ │ GCMCommand.java
│ │ GCMIntentService.java
│ │ GCMRedirectedBroadcastReceiver.java
│ │ …
│ │
│ └─command
│ AnnouncementCommand.java
│ NotificationCommand.java
│ SyncCommand.java
│ …

├─io
│ │ BlocksHandler.java
│ │ HandlerException.java
│ │ HashtagsHandler.java
│ │ …处理model
│ │
│ ├─map
│ │ └─model
│ │ MapData.java
│ │ Marker.java
│ │ Tile.java
│ │
│ └─model
│ Block.java
│ DataManifest.java
│ Hashtag.java
│ …

├─map
│ │ InlineInfoFragment.java
│ │ MapActivity.java
│ │ MapFragment.java
│ │ …
│ │
│ └─util
│ CachedTileProvider.java
│ MarkerLoadingTask.java
│ MarkerModel.java
│ …

├─model
│ ScheduleHelper.java
│ ScheduleItem.java
│ ScheduleItemHelper.java
│ …定义model以及实现model相关操作

├─myschedule
│ MyScheduleActivity.java
│ MyScheduleAdapter.java
│ MyScheduleFragment.java
│ …

├─provider
│ ScheduleContract.java
│ ScheduleContractHelper.java
│ ScheduleDatabase.java
│ …实现ContentProvider
│ (也在此处定义provider依赖的其它类,比如db操作)

├─receiver
│ SessionAlarmReceiver.java

├─service
│ DataBootstrapService.java
│ SessionAlarmService.java
│ SessionCalendarService.java

├─session
│ SessionDetailActivity.java
│ SessionDetailConstants.java
│ SessionDetailFragment.java
│ …

├─settings
│ ConfMessageCardUtils.java
│ SettingsActivity.java
│ SettingsUtils.java

├─social
│ SocialActivity.java
│ SocialFragment.java
│ SocialModel.java

├─sync
│ │ ConferenceDataHandler.java
│ │ RemoteConferenceDataFetcher.java
│ │ SyncAdapter.java
│ │ …
│ │
│ └─userdata
│ │ AbstractUserDataSyncHelper.java
│ │ OnSuccessListener.java
│ │ UserAction.java
│ │ …
│ │
│ ├─gms
│ │ DriveHelper.java
│ │ GMSUserDataSyncHelper.java
│ │
│ └─util
│ UserActionHelper.java
│ UserDataHelper.java

├─ui
│ │ BaseActivity.java
│ │ CheckableLinearLayout.java
│ │ SearchActivity.java
│ │ …BaseActivity以及自定义UI组件
│ │
│ └─widget
│ AspectRatioView.java
│ BakedBezierInterpolator.java
│ BezelImageView.java
│ …自定义小UI控件

├─util
│ AboutUtils.java
│ AccountUtils.java
│ AnalyticsHelper.java
│ …工具类,提供静态方法

├─videolibrary
│ VideoLibraryActivity.java
│ VideoLibraryFilteredActivity.java
│ VideoLibraryFilteredFragment.java
│ …

└─welcome
AccountFragment.java
AttendingFragment.java
ConductFragment.java

4.2类名

类名都以UpperCamelCase风格编写。
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。
名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML, URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

描述
例如
Activity类                     Activity为后缀标识                      欢迎页面类WelcomeActivity

Adapter类                     Adapter 为后缀标识                    

新闻详情适配器 NewDetailAdapter

解析类                          Parser为后缀标识                        首页解析类HomePosterParser

                                     Utils或Manager为后缀标识          线程池管理类:ThreadPoolManager
工具方法类                (与系统或第三方的Utils区分)     日志工具类:LogUtils(Logger也可)
                                     或功能+Utils                                  打印工具类:PrinterUtils

数据库类                       以DBHelper后缀标识                     新闻数据库:NewDBHelper

Service类                       以Service为后缀标识                     时间服务TimeService

BroadcastReceiver类      以Receiver为后缀标识                   推送接收JPushReceiver

ContentProvider类         以Provider为后缀标识                    ShareProvider

自定义的共享基础类     以Base开头                                     BaseActivity,BaseFragment



测试类的命名以它要测试的类的名称开始,以Test结束。例如:HashTest或HashIntegrationTest。
接口(interface):命名规则与类一样采用大驼峰命名法,多以able或ible结尾,如
interface Runnable、interface Accessible。
注意:如果项目采用MVP,所有Model、View、Presenter的接口都以I为前缀,不加后缀,其他的接口采用上述命名规则。

4.3方法名

方法名都以lowerCamelCase风格编写。
方法名通常是动词或动词短语。
方法                               说明
initXX()                           初始化相关方法,使用init为前缀标识,如初始化布局initView()

isXX() checkXX()             方法返回值为boolean型的请使用is或check为前缀标识

getXX()                           返回某个值的方法,使用get为前缀标识

setXX()                            设置某个属性值

handleXX()/processXX()   对数据进行处理的方法

displayXX()/showXX()       弹出提示框和提示信息,使用display/show为前缀标识

updateXX()                        更新数据

saveXX()                           保存数据

resetXX()                           重置数据

clearXX()                           清除数据

removeXX()                       移除数据或者视图等,如removeView();

drawXX()                           绘制数据或效果相关的,使用draw前缀标识

4.4常量名

  • 常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。那,到底什么算是一个常量?
  • 每个常量都是一个静态final字段,但不是所有静态final字段都是常量。在决定一个字段是否是一个常量时,考虑它是否真的感觉像是一个常量。例如,如果任何一个该实例的观测状态是可变的,则它几乎肯定不会是一个常量。只是永远不打算改变对象一般是不够的,它要真的一直不变才能将它示为常量。

// Constants
static final int NUMBER = 5;
static final ImmutableListNAMES = ImmutableList.of(“Ed”, “Ann”);
static final Joiner COMMA_JOINER = Joiner.on(‘,’); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// Not constants
static String nonFinal = “non-final”;
final String nonStatic = “non-static”;
static final SetmutableCollection = new HashSet();
static final ImmutableSetmutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {“these”, “can”, “change”};

4.5非常量字段名

非常量字段名以lowerCamelCase风格的基础上改造为如下风格:基本结构为scopeVariableNameType
scope:范围
非公有,非静态字段命名以m开头。
静态字段命名以s开头。
公有非静态字段命名以p开头。
公有静态字段(全局变量)命名以g开头。
例子:

public class MyClass {
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
private static MyClass sSingleton;
public int pField;
public static int gField;
}
使用1字符前缀来表示作用范围,1个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字母小写,这样保证了对变量名能够进行正确的断句。
Type:类型
考虑到Android中使用很多UI控件,为避免控件和普通成员变量混淆以及更好达意,所有用来表示控件的成员变量统一加上控件缩写作为后缀(文末附有缩写表)。
对于普通变量一般不添加类型后缀,如果统一添加类型后缀,请参考文末的缩写表。
用统一的量词通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。
注意:如果项目中使用ButterKnife,则不添加m前缀,以lowerCamelCase风格命名。
例如,请使用mCustomerStrFirst和mCustomerStrLast,而不要使用mFirstCustomerStr和mLastCustomerStr。
量词列表
量词后缀说明
First
一组变量中的第一个
Last
一组变量中的最后一个
Next
一组变量中的下一个变量
Prev
一组变量中的上一个
Cur
一组变量中的当前变量
说明
* 集合添加如下后缀:List、Map、Set
* 数组添加如下后缀:Arr
* 注意:所有的VO(值对象)统一采用标准的lowerCamelCase风格编写,所有的DTO(数据传输对象)就按照接口文档中定义的字段名编写。

4.6参数名

  • 参数名以lowerCamelCase风格编写。
  • 参数应该避免用单个字符命名。

4.7局部变量名

  • 局部变量名以lowerCamelCase风格编写,比起其它类型的名称,局部变量名可以有更为宽松的缩写。
  • 虽然缩写更宽松,但还是要避免用单字符进行命名,除了临时变量和循环变量。
  • 即使局部变量是final和不可改变的,也不应该把它示为常量,自然也不能用常量的规则去命名它。

4.8临时变量名

  • 临时变量通常被取名为i、j、k、m和n,它们一般用于整型;c、d、e,它们一般用于字符型。 如:for (int i = 0; i < len ; i++)。

4.9类型变量名

  • 类型变量可用以下两种风格之一进行命名:
    1. 单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
    2. 以类命名方式(参考3.2 类名),后面加个大写的T(如:RequestT,FooBarT)。

5、资源文件规范

5.1资源文件(XML/layout)

5.1.1 contentView命名
  • 必须以全部单词小写,单词间以下划线分割,使用名词或名词词组。
  • 所有Activity或Fragment的contentView必须与其类名对应,对应规则为:将所有字母都转为小写,将类型和功能调换(也就是后缀变前缀)。
  • 例如:activity_main.xml
5.1.2 Dialog命名
  • 规则:dialog_描述.xml
  • 例如:dialog_hint.xml
5.1.3 PopupWindow命名
  • 规则:ppw_描述.xml
  • 例如:ppw_info.xml
5.1.4 列表项命名
  • 规则:item_描述.xml
  • 例如:item_city.xml
5.1.5 包含项命名
  • 规则:模块_(位置)描述.xml
  • 例如:activity_main_head.xml、activity_main_bottom.xml
  • 注意:通用的包含项命名采用:项目名称缩写_描述.xml
  • 例如:xxxx_title.xml

5.2资源文件(XML/drawable)

全部小写,采用下划线命名法,加前缀区分
命名模式:可加后缀 _small 表示小图,_big表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:
• 用途模块名逻辑名称
• 用途模块名颜色
• 用途_逻辑名称
• 用途_颜色
说明:用途也指控件类型(具体见附录UI控件缩写表)
例如

名称                                                说明

btn_main_home.png                        按键用途模块名逻辑名称

divider_maket_white.png                分割线用途模块名颜色

ic_edit.png                                       图标用途_逻辑名称

bg_main.png                                    背景用途_逻辑名称

btn_red.png                                      红色按键用途_颜色

btn_red_big.png                               红色大按键用途_颜色

ic_head_small.png                           小头像用途_逻辑名称

bg_input.png                                   输入框背景用途_逻辑名称

divider_white.png                            白色分割线用途_颜色

bg_main_head                                  主模块头部背景图片用途模块名逻辑名称

def_search_cell                                 默认搜索界面单元图片用途模块名逻辑名称

ic_more_help                                    更多帮助图标用途_逻辑名称

divider_list_line                                列表分割线用途_逻辑名称

selector_search_ok                           搜索界面确认选择器用途模块名逻辑名称

shape_music_ring                             音乐界面环形形状用途模块名逻辑名称
如果有多种形态,如按钮选择器:btn_xx.xml(selector)

名称                                             说明

btn_xx                                          按钮图片使用btn_整体效果(selector)

btn_xx_normal                            按钮图片使用btn_正常情况效果

btn_xx_pressed                            按钮图片使用btn_点击时候效果

btn_xx_focused                            state_focused聚焦效果

btn_xx_disabled                          state_enabled (false)不可用效果

btn_xx_checked                            state_checked选中效果

btn_xx_selected                            state_selected选中效果

btn_xx_hovered                             state_hovered悬停效果

btn_xx_checkable                         state_checkable可选效果

btn_xx_activated                           state_activated激活的

btn_xx_windowfocused                 state_window_focused

注意:使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要规范。

5.3资源文件(XML/anim)

  • 全部小写,采用下划线命名法,加前缀区分。
  • 具体动画采用以下规则:模块名_逻辑名称。
  • 例如:refresh_progress.xml、market_cart_add.xml、market_cart_remove.xml。
  • 普通的tween动画采用如下表格中的命名方式:动画类型_方向

名称                                          说明

fade_in                                      淡入

fade_out                                    淡出

push_down_in                           从下方推入

push_down_out                         从下方推出

push_left                                   推向左方

slide_in_from_top                      从头部滑动进入

zoom_enter                               变形进入

slide_in                                     滑动进入

shrink_to_middle                      中间缩小

5.4资源文件(XML/values 中name的命名)

5.4.1 colors

colors的name命名使用下划线命名法,在你的colors.xml文件中应该只是映射颜色的名称一个ARGB值,而没有其它的。不要使用它为不同的按钮来定义ARGB值。
不要这样做

<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
<color name="comment_background_inactive">#5F5F5F</color>
<color name="comment_background_active">#939393</color>
<color name="comment_foreground">#FFFFFF</color>
<color name="comment_foreground_important">#FF9D2F</color>
...
<color name="comment_shadow">#323232</color>

使用这种格式,你会非常容易的开始重复定义ARGB值,这使如果需要改变基本色变的很复杂。同时,这些定义是跟一些环境关联起来的,如button或者comment, 应该放到一个按钮风格中,而不是在color.xml文件中。
相反,这样做

<resources>
<!-- grayscale -->
<color name="white" >#FFFFFF</color>
<color name="gray_light">#DBDBDB</color>
<color name="gray" >#939393</color>
<color name="gray_dark" >#5F5F5F</color>
<color name="black" >#323232</color>
<!-- basic colors -->
<color name="green">#27D34D</color>
<color name="blue">#2A91BD</color>
<color name="orange">#FF9D2F</color>
<color name="red">#FF432F</color>
</resources>

向应用设计者那里要这个调色板,名称不需要跟”green”、”blue”等等相同。”brand_primary”、”brand_secondary”、”brand_negative”这样的名字也是完全可以接受的。 像这样规范的颜色很容易修改或重构,会使应用一共使用了多少种不同的颜色变得非常清晰。 通常一个具有审美价值的UI来说,减少使用颜色的种类是非常重要的。
注意:如果某些颜色和主题有关,那就独立出去写。

5.4.2 dimens

像对待colors.xml一样对待dimens.xml文件 与定义颜色调色板一样,你同时也应该定义一个空隙间隔和字体大小的“调色板”。 一个好的例子,如下所示:

<resources>
<!-- font sizes -->
<dimen name="font_larger">22sp</dimen>
<dimen name="font_large">18sp</dimen>
<dimen name="font_normal">15sp</dimen>
<dimen name="font_small">12sp</dimen>
<!-- typical spacing between two views -->
<dimen name="spacing_huge">40dp</dimen>
<dimen name="spacing_large">24dp</dimen>
<dimen name="spacing_normal">14dp</dimen>
<dimen name="spacing_small">10dp</dimen>
<dimen name="spacing_tiny">4dp</dimen>
<!-- typical sizes of views -->
<dimen name="button_height_tall">60dp</dimen>
<dimen name="button_height_normal">40dp</dimen>
<dimen name="button_height_short">32dp</dimen>
</resources>

布局时在写margins和paddings时,你应该使用spacing_xxxx尺寸格式来布局,而不是像对待string字符串一样直接写值。 这样写会非常有感觉,会使组织和改变风格或布局是非常容易。

5.4.3 strings
  • strings的name命名使用下划线命名法,采用以下规则:模块名+逻辑名称,这样方便同一个界面的所有string都放到一起,方便查找。

名称                                    说明

main_menu_about              主菜单按键文字

friend_title                          好友模块标题栏

friend_dialog_del                好友删除提示                                    

login_check_email              登录验证

dialog_title                         弹出框标题

button_ok                           确认键

loading                               加载文字

5.4.4 styles

style的name命名使用大驼峰命名法,几乎每个项目都需要适当的使用style文件,因为对于一个视图来说有一个重复的外观是很常见的,将所有的外观细节属性(colors、padding、font)放在style文件中。 在应用中对于大多数文本内容,最起码你应该有一个通用的style文件,例如:

<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>

应用到TextView中:

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>

你或许需要为按钮控件做同样的事情,不要停止在那里。将一组相关的和重复android:**的属性放到一个通用的style中。
将一个大的style文件分割成多个文件,你可以有多个styles.xml 文件。Android SDK支持其它文件,styles这个文件名称并没有作用,起作用的是在文件里xml的

5.5layout中的id命名

命名模式为:view缩写模块名逻辑名,比如btn_main_search
使用AndroidStudio的插件ButterKnife Zelezny,生成注解非常方便,原生的话可以使用Android Code Generator插件。(ID缩写参考附录常见缩写)

6、注释规范(后面补齐)

6.1类注释

6.2方法注释

6.3块注释

6.4其他代码注释

7、其他规范



附录

UI控件缩写表

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

常见的英文单词缩写表

名称             缩写

icon             ic (主要用在app的图标)

color           cl(主要用于颜色值)

average       avg

background      bg(主要用于布局和子布局的背景)

buffer           buf

control         ctrl

default          def

delete            del

document      doc

error               err

escape           esc

increment       inc

infomation       info

initial                init

image                img

Internationalization      I18N

length                len

library                lib

message            msg

password          pwd

position             pos

server                srv

string                 str

temp                   tmp

window              wnd(win)
程序中使用单词缩写原则:不要用缩写,除非该缩写是约定俗成的。

原创粉丝点击