Commit 7198fbe86ee096bbb842f1e435116edea5e8a48d

Authored by 李攀
1 parent 568d9a23

docs and fix some bug

  1 +# 青柠UMS![logo](./screenshot/ic_launcher.png)
  2 +
  3 +---
  4 +
  5 +青柠UMS是由青柠科技有限公司于2017年初启动的一套点播影院的无人值守项目。此客户端
  6 +包括基本功能包括接受服务器相关指令播放电影,开关门,开关对应灯光,在电影播放时控
  7 +制电影的播放暂停等功能。适用机型z3s,z4系统,h1系统,其他更高版本机器没有试过。
  8 +
  9 +## 获取本机相关信息
  10 +向服务器拉取相关的门禁灯光等信息(`RoomInfo.java`)保存在本地。
  11 +
  12 +## 智能模块相关
  13 +灯光及门禁的控制代码及使用请参见文件[fangtang](./fangtang.md)[light](./lights.md)
  14 +[lock](./lock.md),灯光控制渐变参见`CinemaControlService.java`
  15 +
  16 +## 长连接
  17 +投影与服务器保持长连接接收相关控制命令及上报相关状态信息 详见SocketService1.java
  18 +智能模块的初始化及相关具体操作 详见 `SmartControlService.java`,长连接信息均为
  19 +json格式。
  20 +通过向服务器发送包含`room_sn`的注册信息,服务器返回相应用认证信息`RETURN_VERIFY_CODE`,解密后
  21 +将认证信息发送给服务器,返回认证成功`VERIFY_SUCCESS`后启动心跳包.后等待相应控制命令到达再作操作。
  22 +
  23 +## 机器状态信息获取
  24 +播放相关状态信息 `CinemaControlService.java`,播放器启动后会绑定当前服务不断上报当前的播放进度
  25 +在需要时可自取。
  26 +获取服务器连接状态,在建立长连接时会在`FangTangApplication`中保存一个状态信息。
  27 +灯光状态类似服务器,在连接时会保存相应信息。门禁只是对相应的mac地址发消息获取不到是否连接的情况
  28 +有些商家不使用灯光与门禁,在显示连接状态时需做判定。
  29 +
  30 +## 日志保存
  31 +`LogUtils` ,`/sdcard/ft_log/`
  32 +
  33 +
  34 +## 其他
  35 +界面操作,db,文件扫描等参见影吧相关文档
\ No newline at end of file
... ...
  1 +#Google Java Style
  2 +
  3 +## 一、介绍
  4 +
  5 +本文档为Google Java编程规范的完整定义。依照此规范编写的Java源码文件可以被称为Google Style。
  6 +
  7 +和其他编程规范指南一样,规范不仅包括了代码的结构美学,也包括了其他一些业界约定俗成的公约和普遍采用的标准。本文档中的规范基本都是业界已经达成共识的标准,我们尽量避免去定义那些还存在争议的地方。
  8 +
  9 +
  10 +### 1.1 术语说明
  11 +
  12 +本文档除非特殊说明,否则:
  13 +a、`class`(类)统指普通的`class`类型、`enum`枚举类型、`interface`类型和`annotation`类型。
  14 +b、`comment`(注释)总是指`implementation comments`(实现注释,/* */)。我们不使用“文档注释”这样的说法,而会直接说javadoc。
  15 +
  16 +其他术语说明,将在文档中需要说明的地方单独说明。
  17 +
  18 +
  19 +### 1.2 文档说明
  20 +
  21 +本文档中的代码并不一定符合所有规范。即使这些代码遵循Google Style,但这不是唯一的代码规范。例子中可选的格式风格也不应该作为强制执行的规范。
  22 +
  23 +
  24 +
  25 +## 二、源码文件基础
  26 +
  27 +
  28 +### 2.1 文件名
  29 +
  30 +源码文件名由它所包含的顶级class的类名(大小写敏感),加上.java后缀组成。(除了package-info.java文件)。
  31 +
  32 +
  33 +### 2.2 文件编码:UTF-8
  34 +
  35 +源码文件使用UTF-8编码。
  36 +
  37 +
  38 +### 2.3 特殊字符
  39 +
  40 +#### 2.3.1 空格字符
  41 +
  42 +除了换行符外,ASCII水平空白字符(0x20)是源码文件中唯一支持的空格字符。这意味着:
  43 +a、其他空白字符将被转义。
  44 +b、Tab字符不被用作缩进控制。
  45 +
  46 +
  47 +#### 2.3.2 特殊转义字符串
  48 +
  49 +任何需要转义字符串表示的字符(例如\b, \t, \n, \f, \r, \', \\等),采用这种转义字符串的方式表示,而不采用对应字符的八进制数(例如 \012)或Unicode码(例如 \u000a)表示。
  50 +
  51 +
  52 +#### 2.3.3 非ASCII字符
  53 +
  54 +对于其余非ASCII字符,直接使用Unicode字符(例如 ∞),或者使用对应的Unicode码(例如 \u221e)转义,都是允许的。唯一需要考虑的是,何种方式更能使代码容易阅读和理解。
  55 +
  56 +注意:在使用unicode码转义,或者甚至是有时直接使用unicode字符的时候,添加一点说明注释将对别人读懂代码很有帮助。
  57 +
  58 +例子:
  59 +```java
  60 + Example Discussion
  61 + String unitAbbrev = "μs"; Best: perfectly clear even without a comment.
  62 + String unitAbbrev = "\u03bcs"; // "μs" Allowed, but there's no reason to do this.
  63 + String unitAbbrev = "\u03bcs"; // Greek letter mu, "s" Allowed, but awkward and prone to mistakes.
  64 + String unitAbbrev = "\u03bcs"; Poor: the reader has no idea what this is.
  65 + return '\ufeff' + content; // byte order mark Good: use escapes for non-printable characters, and comment if necessary.
  66 +
  67 + //注意:不要因为担心一些程序无法正常处理费ASCII字符而不使用它,从而导致代码易读性变差。如果出现这样的问题,应该由出现问题的程序去解决。
  68 +```
  69 +
  70 +
  71 +
  72 +## 三、源码文件结构
  73 +
  74 +源码文件按照先后顺序,由以下几部分组成:
  75 +a、License或者copyright声明信息。(如果需要声明)
  76 +b、包声明语句。
  77 +c、import语句。
  78 +d、class类声明(每个源码文件只能有唯一一个顶级class)。
  79 +
  80 +每个部分之间应该只有一行空行作为间隔。
  81 +
  82 +
  83 +### 3.1 license 或者 copyright的声明信息。
  84 +
  85 +如果需要声明license或copyright信息,应该在文件开始时声明。
  86 +
  87 +
  88 +### 3.2 包声明
  89 +
  90 +包声明的行,没有行长度的限制。单行长度限制(4.4部分有详细说明,80或100)不适用于包声明。
  91 +
  92 +
  93 +### 3.3 import语句
  94 +
  95 +#### 3.3.1 不使用通配符import
  96 +
  97 +不应该使用通配符import,不管是否是静态导入。
  98 +
  99 +
  100 +#### 3.3.2 没有行长度限制
  101 +
  102 +import语句的行,没有行长度的限制。单行长度限制(4.4部分有详细说明,80或100)不适用于import语句所在行。
  103 +
  104 +
  105 +#### 3.3.3 顺序和空行
  106 +
  107 +import语句应该被分为几个组,每个组之间由单行的空行隔开。分组的顺序如下:
  108 +
  109 +a、所有的static import为归为一组。
  110 +b、com.google 包的import归为一组。
  111 +c、使用的第三方包的引用。每个顶级第三方包归为一组。第三方包之间按ASCII码排序。例如:android, com, junit, org, sun
  112 +d、java包归为一组。
  113 +e、javax包归为一组。
  114 +
  115 +同一组内的import语句之间不应用空行隔开。同一组中的import语句按ASCII码排序。
  116 +
  117 +
  118 +
  119 +### 3.4 类声明
  120 +
  121 +#### 3.4.1 只声明唯一一个顶级class
  122 +
  123 +每个源码文件中只能有一个顶级class。package-info.java文件除外。
  124 +
  125 +
  126 +#### 3.4.2 类成员顺序
  127 +
  128 +类成员的顺序对代码的易读性有很大影响,但是没有一个统一正确的标准。不同的类可能有不同的排序方式。
  129 +
  130 +重要的是,每个class都要按照一定的逻辑规律排序。当被问及时,能够解释清楚为什么这样排序。例如,新增加的成员方法,不是简单地放在class代码最后面,按日期排序不是按逻辑排序。
  131 +
  132 +
  133 +3.4.2.1 重载方法:不应该分开
  134 +
  135 +当一个类有多个构造函数,或者多个同名成员方法时,这些函数应该写在一起,不应该被其他成员分开。
  136 +
  137 +
  138 +
  139 +## 四、格式
  140 +
  141 +术语说明:块状结构(block-like construct)指类、成员函数和构造函数的实现部分(花括号中间部分)。注意,在后面的4.8.3.1节中讲到数组初始化,所有的数组初始化都可以被认为是一个块状结构(非强制)。
  142 +
  143 +
  144 +### 4.1 花括号
  145 +
  146 +#### 4.1.1 花括号在需要的地方使用
  147 +
  148 +花括号一般用在if, else, for, do, 和 while等语句。甚至当它的实现为空或者只有一句话时,也需要使用。
  149 +
  150 +
  151 +#### 4.1.2 非空语句块采用K&R风格
  152 +
  153 +对于非空语句块,花括号遵循K&R风格:
  154 +
  155 +a、左括号前不换行。
  156 +b、左括号后换行。
  157 +c、右括号前换行。
  158 +d、如果右括号结束一个语句块或者函数体、构造函数体或者有命名的类体,则需要换行。例如,当右括号后面接else或者逗号时,不应该换行。
  159 +
  160 +例子:
  161 +
  162 +
  163 +一些例外的情况,将在4.8.1节讲枚举类型的时候讲到。
  164 +
  165 +
  166 +#### 4.1.3 空语句块:使代码更简洁
  167 +
  168 +一个空的语句块,可以在左花括号之后直接接右花括号,中间不需要空格或换行。但是当一个由几个语句块联合组成的语句块时,则需要换行。(例如:if/else-if/else try/catch/finally).
  169 +
  170 +例子:
  171 +void doNothing () {}
  172 +
  173 +
  174 +### 4.2 语句块的缩进:2空格
  175 +
  176 +每当一个新的语句块产生,缩进就增加两个空格。当这个语句块结束时,缩进恢复到上一层级的缩进格数。缩进要求对整个语句块中的代码和注释都适用。(例子可参考之前4.1.2节中的例子)。
  177 +
  178 +
  179 +### 4.3 一行最多只有一句代码
  180 +
  181 +每句代码的结束都需要换行。
  182 +
  183 +
  184 +### 4.4 行长度限制:80或100
  185 +
  186 +不同的项目可以选择采用80个字符或者100个字符作为限制。除了以下几个特殊情况外,其他代码内容都需要遵守这个长度限制。这在4.5节会有详细解释。
  187 +
  188 +例外:
  189 +a、按照行长度限制,无法实现地方(例如:javadoc中超长的URL地址, 或者一个超长的JSNI方法的引用);
  190 +b、package和import语句不受长度限制。(见3.2、3.3节);
  191 +c、注释中的命令行指令行,将被直接复制到shell中执行的。
  192 +
  193 +
  194 +### 4.5 长行断行
  195 +
  196 +术语说明:当一行代码按照其他规范都合法,只是为了避免超出行长度限制而换行时,称为长行断行。
  197 +
  198 +长行断行,没有一个适合所有场景的全面、确定的规范。但很多相同的情况,我们经常使用一些行之有效的断行方法。
  199 +
  200 +注意:将长行封装为函数,或者使用局部变量的方法,也可以解决一些超出行长度限制的情况。并非一定要断行。
  201 +
  202 +
  203 +#### 4.5.1 在何处断行
  204 +
  205 +断行的主要原则是:选择在更高一级的语法逻辑的地方断行。其他一些原则如下:
  206 +a、当一个非赋值运算的语句断行时,在运算符号之前断行。(这与Google的C++规范和JavaScrip规范等其他规范不同)。
  207 +b、当一个赋值运算语句断行时,一般在赋值符号之后断行。但是也可以在之前断行。
  208 +c、在调用函数或者构造函数需要断行时,与函数名相连的左括号要在一行。也就是在左括号之后断行。
  209 +d、逗号断行时,要和逗号隔开的前面的语句断行。也就是在逗号之后断行。
  210 +
  211 +
  212 +#### 4.5.2 断行的缩进:至少4个字符
  213 +
  214 +当断行之后,在第一行之后的行,我们叫做延续行。每一个延续行在第一行的基础上至少缩进四个字符。
  215 +当原行之后有多个延续行的情况,缩进可以大于4个字符。如果多个延续行之间由同样的语法元素断行,它们可以采用相同的缩进。
  216 +
  217 +4.5.3节介绍水平对齐中,解决了使用多个空格与之前行缩进对齐的问题。
  218 +
  219 +
  220 +### 4.6 空白空间
  221 +
  222 +#### 4.6.1 垂直空白
  223 +
  224 +单行空行在以下情况使用:
  225 +a、类成员间需要空行隔开:例如成员变量、构造函数、成员函数、内部类、静态初始化语句块(static initializers)、实例初始化语句块(instance initializers)。
  226 + 例外:成员变量之间的空白行不是必需的。一般多个成员变量中间的空行,是为了对成员变量做逻辑上的分组。
  227 +b、在函数内部,根据代码逻辑分组的需要,设置空白行作为间隔。
  228 +c、类的第一个成员之前,或者最后一个成员结束之后,用空行间隔。(可选)
  229 +d、本文档中其他部分介绍的需要空行的情况。(例如 3.3节中的import语句)
  230 +
  231 +单空行时使用多行空行是允许的,但是不要求也不鼓励。
  232 +
  233 +
  234 +#### 4.6.2 水平空白
  235 +
  236 +除了语法、其他规则、词语分隔、注释和javadoc外,水平的ASCII空格只在以下情况出现:
  237 +
  238 +a、所有保留的关键字与紧接它之后的位于同一行的左括号之间需要用空格隔开。(例如if、for、catch)
  239 +b、所有保留的关键字与在它之前的右花括号之间需要空格隔开。(例如else、catch)
  240 +c、在左花括号之前都需要空格隔开。只有两种例外:
  241 + @SomeAnnotation({a, b})
  242 + String [][] x = {{ "foo" }};
  243 +d、所有的二元运算符和三元运算符的两边,都需要空格隔开。
  244 +e、逗号、冒号、分号和右括号之后,需要空格隔开。
  245 +f、// 双斜线开始一行注释时。双斜线两边都应该用空格隔开。并且可使用多个空格,但是不做强制要求。
  246 +g、变量声明时,变量类型和变量名之间需要用空格隔开。
  247 +h、初始化一个数组时,花括号之间可以用空格隔开,也可以不使用。(例如:new int[] {5, 6} 和 new int[] { 5, 6 } 都可以)
  248 +
  249 +注意:这一原则不影响一行开始或者结束时的空格。只针对行内部字符之间的隔开。
  250 +
  251 +
  252 +#### 4.6.3 水平对齐:不做强制要求
  253 +
  254 +术语说明:水平对齐,是指通过添加多个空格,使本行的某一符号与上一行的某一符号上下对齐。
  255 +
  256 +这种对齐是被允许的,但是不会做强制要求。
  257 +
  258 +以下是没有水平对齐和水平对齐的例子;
  259 +private int x ; // this is fine
  260 +private Color color ; // this too
  261 +
  262 +private int x ; // permitted, but future edits
  263 +private Color color ; // may leave it unaligned
  264 +
  265 +注意:水平对齐能够增加代码的可读性,但是增加了未来维护代码的难度。考虑到维护时只需要改变一行代码,之前的对齐可以不需要改动。为了对齐,你更有可能改了一行代码,同时需要更改附近的好几行代码,而这几行代码的改动,可能又会引起一些为了保持对齐的代码改动。那原本这行改动,我们称之为“爆炸半径”。这种改动,在最坏的情况下可能会导致大量的无意义的工作,即使在最好的情况下,也会影响版本历史信息,减慢代码review的速度,引起更多merge代码冲突的情况。
  266 +
  267 +
  268 +### 4.7 分组括号:建议使用
  269 +
  270 +非必须的分组括号只有在编写代码者和代码审核者都认为大家不会因为没有它而导致代码理解错误的时候,或者它不会使代码更易理解的时候才能省略。没有理由认为所有阅读代码的人都能记住所有java运算符的优先级。
  271 +
  272 +
  273 +### 4.8 特殊结构
  274 +
  275 +#### 4.8.1 枚举类型
  276 +
  277 +每个逗号后接一个枚举变量,不要求换行。
  278 +枚举类型,如果没有函数和javadoc,处理格式是可以按照数组初始化来处理。
  279 +
  280 +例子:
  281 +private enum Suit { CLUBS , HEARTS , SPADES , DIAMONDS }
  282 +
  283 +枚举类型也是一种类(Class),因此Class类的其他格式要求,也适用于枚举类型。
  284 +
  285 +
  286 +#### 4.8.2 变量声明
  287 +
  288 +##### 4.8.2.1 每次声明一个变量
  289 +
  290 +不要采用一个声明,声明多个变量。例如 int a, b;
  291 +
  292 +
  293 +##### 4.8.2.2 当需要时才声明,尽快完成初始化
  294 +
  295 +局部变量不应该习惯性地放在语句块的开始处声明,而应该尽量离它第一次使用的地方最近的地方声明,以减小它们的使用范围。
  296 +局部变量应该在声明的时候就进行初始化。如果不能在声明时初始化,也应该尽快完成初始化。
  297 +
  298 +
  299 +#### 4.8.3 数组
  300 +
  301 +##### 4.8.3.1 数组初始化:可以类似块代码处理
  302 +
  303 +所有数组的初始化,都可以采用和块代码相同的格式处理。例如以下格式都是允许的:
  304 +
  305 +
  306 +
  307 +##### 4.8.3.2 不能像C风格一样声明数组
  308 +
  309 +方括号应该是变量类型的一部分,因此不应该和变量名放在一起。例如:应该是 String [] args,而不是 String args[]
  310 +
  311 +
  312 +#### 4.8.4 switch语句
  313 +
  314 +术语说明:switch语句是指在switch花括号中,包含了一组或多组语句块。每组语句块都由一个或多个switch标签(例如case FOO:或者 default:)打头。
  315 +
  316 +
  317 +#### 4.8.4.1 缩进
  318 +
  319 +和其他语句块一样,switch花括号之后缩进两个字符。
  320 +每个switch标签之后,后面紧接的非标签的新行,按照花括号相同的处理方式缩进两个字符。在标签结束后,恢复到之前的缩进,类似花括号结束。
  321 +
  322 +
  323 +#### 4.8.4.2 继续向下执行的注释
  324 +
  325 +在switch语句中,每个标签对应的代码执行完后,都应该通过语句结束(例如:break、continue、return 或抛出异常),否则应该通过注释说明,代码需要继续向下执行下一个标签的代码。注释说明文字只要能说明代码需要继续往下执行都可以(通常是 //fall through)。这个注释在最后一个标签之后不需要注释。例如:
  326 +
  327 +
  328 +
  329 +
  330 +#### 4.8.4.3 default标签需要显式声明
  331 +
  332 +每个switch语句中,都需要显式声明default标签。即使没有任何代码也需要显示声明。
  333 +
  334 +
  335 +### 4.8.5 Annotations
  336 +
  337 +Annotations应用到类、函数或者构造函数时,应紧接javadoc之后。每一行只有一个Annotations。
  338 +Annotations所在行不受行长度限制,也不需要增加缩进。例如:
  339 +```java
  340 +@Override
  341 +@Nullable
  342 +public String getNameIfPresent () { ... }
  343 +```
  344 +例外情况:
  345 +如果Annotations只有一个,并且不带参数。则它可以和类或方法名放在同一行。例如:
  346 +```@Override public int hashCode () { ... }```
  347 +
  348 +Annotations应用到成员变量时,也是紧接javadoc之后。不同的是,多个annotations可以放在同一行。例如:
  349 +```@Partial @Mock DataLoader loader ;```
  350 +
  351 +对于参数或者局部变量使用Annotations的情况,没有特定的规范。
  352 +
  353 +
  354 +### 4.8.6 注释
  355 +
  356 +#### 4.8.6.1 语句块的注释风格
  357 +
  358 +注释的缩进与它所注释的代码缩进相同。可以采用 /* */ 进行注释,也可以用 // 进行注释。当使用 /**/ 进行多行注释时,每一行都应该以 * 开始, 并且 * 应该上下对齐。
  359 +例如:
  360 +
  361 +
  362 +多行注释时,如果你希望集成开发环境能自动对齐注释,你应该使用 /**/, //一般不会自动对齐。
  363 +
  364 +
  365 +### 4.8.7 修饰符
  366 +
  367 +多个类和成员变量的修饰符,按Java Lauguage Specification中介绍的先后顺序排序。具体是:
  368 +
  369 +public protected private abstract static final transient volatile synchronized native strictfp
  370 +
  371 +
  372 +
  373 +## 五、 命名
  374 +
  375 +
  376 +### 5.1 适用于所有命名标识符的通用规范
  377 +
  378 +标示符只应该使用ASCII字母、数字和下划线,字母大小写敏感。因此所有的标示符,都应该能匹配正则表达式 \w+ 。
  379 +Google Style中,标示符不需要使用特殊的前缀或后缀,例如: name_ , mName , s_name 和 kName 。
  380 +
  381 +
  382 +### 5.2 不同类型的标示符规范
  383 +
  384 +#### 5.2.1 包名
  385 +
  386 +包名全部用小写字母,通过 . 将各级连在一起。不应该使用下划线。
  387 +
  388 +
  389 +#### 5.2.2 类名
  390 +
  391 +类型的命名,采用以大写字母开头的大小写字符间隔的方式(UpperCamelCase)。
  392 +class命名一般使用名词或名词短语。interface的命名有时也可以使用形容词或形容词短语。annotation没有明确固定的规范。
  393 +
  394 +测试类的命名,应该以它所测试的类的名字为开头,并在最后加上Test结尾。例如:HashTest 、 HashIntegrationTest。
  395 +
  396 +
  397 +#### 5.2.3 方法名
  398 +
  399 +方法命名,采用以小写字母开头的大小写字符间隔的方式(lowerCamelCase)。
  400 +方法命名一般使用动词或者动词短语。
  401 +
  402 +在JUnit的测试方法中,可以使用下划线,用来区分测试逻辑的名字,经常使用如下的结构:test <MethodUnderTest>_ <state> 。例如:testPop_emptyStack 。
  403 +测试方法也可以用其他方式进行命名。
  404 +
  405 +
  406 +#### 5.2.4 常量名
  407 +
  408 +常量命名,全部使用大写字符,词与词之间用下划线隔开。(CONSTANCE_CASE)。
  409 +
  410 +常量是一个静态成员变量,但不是所有的静态成员变量都是常量。在选择使用常量命名规则给变量命名时,你需要明确这个变量是否是常量。例如,如果这个变量的状态可以发生改变,那么这个变量几乎可以肯定不是常量。只是计划不会发生改变的变量不足以成为一个常量。下面是常量和非常量的例子:
  411 +
  412 +
  413 +
  414 +
  415 +常量一般使用名词或者名词短语命名。
  416 +
  417 +
  418 +#### 5.2.5 非常量的成员变量名
  419 +
  420 +非常量的成员变量命名(包括静态变量和非静态变量),采用lowerCamelCase命名。
  421 +一般使用名词或名词短语。
  422 +
  423 +
  424 +#### 5.2.6 参数名
  425 +
  426 +参数命名采用lowerCamelCase命名。
  427 +应该避免使用一个字符作为参数的命名方式。
  428 +
  429 +
  430 +#### 5.2.7 局部变量名
  431 +
  432 +局部变量采用lowerCamelCase命名。它相对于其他类型的命名,可以采用更简短宽松的方式。
  433 +但即使如此,也应该尽量避免采用单个字母进行命名的情况,除了在循环体内使用的临时变量。
  434 +
  435 +即使局部变量是final、不可改变的,它也不能被认为是常量,也不应该采用常量的命名方式去命名。
  436 +
  437 +
  438 +#### 5.2.8 类型名
  439 +
  440 +类型名有两种命名方式:
  441 +
  442 +a、单独一个大写字母,有时后面再跟一个数字。(例如,E、T、X、T2)。
  443 +b、像一般的class命名一样(见5.2.2节),再在最后接一个大写字母。(例如,RequestT、FooBarT)。
  444 +
  445 +
  446 +### 5.3 Camel case的定义
  447 +
  448 +有时一些短语被写成Camel case的时候可以有多种写法。例如一些缩写词汇,或者一些组合词:IPv6 或者 iOS 等。
  449 +为了统一写法,Google style给出了一种几乎可以确定为一种的写法。
  450 +
  451 +a、将字符全部转换为ASCII字符,并且去掉 ' 等符号。例如, "Müller's algorithm" 被转换为 "Muellers algorithm" 。
  452 +b、将上一步转换的结果拆分成一个一个的词语。从空格处和从其他剩下的标点符号处划分。
  453 + 注意:一些已经是Camel case的词语,也应该在这个时候被拆分。(例如 AdWords 被拆分为 ad words)。但是例如iOS之类的词语,它其实不是一个Camel case的词语,而是人们惯例使用的一个词语,因此不用做拆分。
  454 +c、经过上面两部后,先将所有的字母转换为小写,再把每个词语的第一个字母转换为大写。
  455 +d、最后,将所有词语连在一起,形成一个标示符。
  456 +
  457 +注意:词语原来的大小写规则,应该被完全忽略。以下是一些例子:
  458 +
  459 +
  460 +
  461 +* 号表示可以接受,但是不建议使用。
  462 +
  463 +注意,有些词语在英文中,可以用 - 连接使用,也可以不使用 - 直接使用。例如 `nonempty`和 `non-empty`都是可以的。因此,方法名字为checkNonempty 或者checkNonEmpty 都是可以的。
  464 +
  465 +
  466 +
  467 +## 六、编程实践
  468 +
  469 +
  470 +### 6.1 @override 都应该使用
  471 +
  472 +@override annotations只要是符合语法的,都应该使用。
  473 +
  474 +
  475 +### 6.2 异常捕获 不应该被忽略
  476 +
  477 +一般情况下,catch住的异常不应该被忽略,而是都需要做适当的处理。例如将错误日志打印出来,或者如果认为这种异常不会发生,则应该作为断言异常重新抛出。
  478 +
  479 +如果这个catch住的异常确实不需要任何处理,也应该通过注释做出说明。例如:
  480 +
  481 +
  482 +
  483 +例外:在测试类里,有时会针对方法是否会抛出指定的异常,这样的异常是可以被忽略的。但是这个异常通常需要命名为: expected。例如:
  484 +
  485 +
  486 +
  487 +### 6.3 静态成员的访问:应该通过类,而不是对象
  488 +
  489 +当一个静态成员被访问时,应该通过class名去访问,而不应该使用这个class的具体实例对象。例如:
  490 +
  491 +
  492 +
  493 +
  494 +### 6.4 不使用Finalizers 方法
  495 +
  496 +重载Object的finalize方法是非常非常罕见的。
  497 +
  498 +注意:不应该使用这以方法。如果你认为你必须使用,请先仔细阅读并理解 `Effective Java` 第七条 “ Avoid Finalizers”。然后不要使用它。
  499 +
  500 +
  501 +
  502 +## 七、Javadoc
  503 +
  504 +### 7.1 格式规范
  505 +
  506 +#### 7.1.1 通用格式
  507 +
  508 +最基本的javadoc的通用格式如下例:
  509 +
  510 +
  511 +或者为单行格式:
  512 +
  513 +
  514 +通用格式在任何时候使用都是可以的。当javadoc块只有一行时,可以使用单行格式来替代通用格式。
  515 +
  516 +
  517 +#### 7.1.2 段落
  518 +
  519 +空白行:是指javadoc中,上下两个段落之间只有上下对齐的 * 字符的行。每个段落的第一行在第一个字符之前,有一个<p>标签,并且之后不要有任何空格。
  520 +
  521 +
  522 +#### 7.1.3 @从句
  523 +
  524 +所有标准的@从句,应该按照如下的顺序添加:@param、@return、@throws、@deprecated。并且这四种@从句,不应该出现在一个没有描述的Javadoc块中。
  525 +当@从句无法在一行写完时,应该断行。延续行在第一行的@字符的位置,缩进至少4个字符单位。
  526 +
  527 +
  528 +### 7.2 摘要片段
  529 +
  530 +每个类或者成员的javadoc,都是由一个摘要片段开始的。这个片段非常重要。因为它是类或者方法在使用时唯一能看到的文本说明。
  531 +主要摘要只是一个片段,应该是一个名词短语或者动词短语,而不应该是一个完整的句子。但是它应该像一个完整的句子一样使用标点符号。
  532 +
  533 +注意:一种常见的错误是以这种形式使用javadoc: /** @return the customer ID */ .这是不对的。应该改为: /** Returns the customer ID. */ .
  534 +
  535 +
  536 +### 7.3 何处应该使用Javadoc
  537 +
  538 +至少,Javadoc应该应用于所有的public类、public和protected的成员变量和方法。和少量例外的情况。例外情况如下。
  539 +
  540 +
  541 +#### 7.3.1 例外:方法本身已经足够说明的情况
  542 +
  543 +当方法本身很显而易见时,可以不需要javadoc。例如:getFoo。没有必要加上javadoc说明“Returns the foo”。
  544 +单元测试中的方法基本都能通过方法名,显而易见地知道方法的作用。因此不需要增加javadoc。
  545 +
  546 +注意:有时候不应该引用此例外,来省略一些用户需要知道的信息。例如:getCannicalName 。当大部分代码阅读者不知道canonical name是什么意思时,不应该省略Javadoc,认为只能写/** Returns the canonical name. */ 。
  547 +
  548 +
  549 +#### 7.3.2 例外:重载方法
  550 +
  551 +重载方法有时不需要再写Javadoc。
  552 +
  553 +
  554 +#### 7.3.3 例外:可选的javadoc
  555 +
  556 +一些在包外不可见的class和成员变量或方法,根据需要,也可以使用javadoc。当一个注释用以说明这个类、变量或者方法的总体目标或行为时,可以使用Javadoc。
\ No newline at end of file
... ...
... ... @@ -15,7 +15,7 @@
15 15 分别填入之前的名字及新的名字,保存信息后,进入主页,点Add Devices添加设置,直到成功(如下图)点add finished即可重置完成,进入主页面,进行控制
16 16 ![添加成功](../screenshot/add_device_success.png)
17 17
18   -#### 联多智能灯,重设
  18 +#### 联多智能灯,重设
19 19 若扫描出联了多个智能灯,需要先找到当前所需要控制的灯,长按进入,进行kick操作,如下图,kick成功后灯光会闪烁,智能灯name会被设置为kick
20 20 ![kick当前智能灯](../screenshot/settings.png)
21 21 返回主页进入设置,重新设置name,如下图填入新name (abc),以及被kick name(kick),然后保存信息,返回主页
... ...
1 1 # lock name change
2 2
3   -url:`http://dsmzg.com:8080/greentown/login.action`
  3 +url:`http://dsmzg.com:8080/greentown/login.action`
4 4 user_name&pwd:`jmsq0011`
\ No newline at end of file
... ...
  1 +## 青柠`java/android`代码规范
  2 +
  3 +**主要参见google code style 下面规定一些强制要求,其他尽量向文档靠近**
  4 +
  5 +>* 编码utf-8
  6 +>* tab 4 个空格,缩进用tab,不使用其中建议我两个
  7 +>* 命名用驼峰,类名用大驼峰,方法名及成员变量等用小驼峰。尽量使用英文,不要出现拼音,除一些特殊的字段(如`qnbar,xgimi`等常用名字,再如`arr,dict`等常用缩写),尽量不要出现单词拼写出错的情况
  8 +>* 命名时不要存在歧义,若写时想不好,一定要写好注释,方便查看及更正
  9 +>* 每行不要太长,实在不可避免时在适当位置换行
  10 +>* 不要出现大段空行的情况
  11 +>* 花括号遵循K&R风格,空的语句块,可以在左花括号之后直接接右花括号,中间不需要空格或换行,参见`google code style`
  12 +>* 变量声明时每个变量占一行
  13 +>* 修饰符顺序`public protected private abstract static final transient volatile synchronized native strictfp`,如声明常量
  14 +`private static final String NAME = "QnBar";`
  15 +>* 给类或方法写注释时使用`/** comment */`格式,方便文档直接查看。其他注释暂不做强制要求
  16 +>* 资源文件命名时尽量带上前缀,例如:`activity_main.xml`, Dialog命名:dialog_描述.xml例如:`dialog_hint.xml`, PopupWindow命名:ppw_描述.xml
  17 + 例如:`ppw_info.xml`,列表项命名:item_描述.xml例如:`item_city.xml`, 包含项命名:模块_(位置)描述.xml
  18 + 例如:`activity_main_head.xml`、`activity_main_bottom.xml`注意:通用的包含项命名采用:项目名称缩写_描述.xml
  19 + 例如:`xxxx_title.xml`
... ...
... ... @@ -275,7 +275,7 @@ public class LocalMovieScanUtils {
275 275 return movies;
276 276 }
277 277 int length = fileDirs.length;
278   - int coreCount = 8;
  278 + int coreCount = 4;
279 279 int poolCount = 9;
280 280 ThreadPoolExecutor myExecutor = new ThreadPoolExecutor(coreCount, poolCount,
281 281 200, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
... ...
... ... @@ -113,6 +113,7 @@ public class SocketService1 extends BaseService {
113 113 AtomicBoolean sendRegister = new AtomicBoolean(false);
114 114 AtomicInteger heartBeatErrorCount = new AtomicInteger(0);
115 115
  116 + private SystemUtils systemUtils;
116 117 private ICinemaControl iPlayer = null;
117 118 private ServiceConnection conn = new ServiceConnection() {
118 119 public void onServiceConnected(ComponentName className, IBinder service) {
... ... @@ -166,7 +167,7 @@ public class SocketService1 extends BaseService {
166 167 }
167 168 };
168 169
169   - private Context context = this;
  170 + private Context context;
170 171 private InitSocketThread initSocketThread;
171 172 private ReadThread readThread;
172 173
... ... @@ -185,6 +186,8 @@ public class SocketService1 extends BaseService {
185 186 @Override
186 187 public int onStartCommand(Intent intent, int flags, int startId) {
187 188 super.onStartCommand(intent, flags, startId);
  189 + context = this;
  190 + systemUtils = new SystemUtils();
188 191 LogUtils.i(TAG, "onStartCommand");
189 192 int ftTest = Utils.getInt(this, "ft-test", 0);
190 193 switch (ftTest) {
... ... @@ -659,7 +662,12 @@ public class SocketService1 extends BaseService {
659 662 }
660 663
661 664 private void pressCenterKey() {
662   - ShellUtils.execCommand("input keyevent 23", false);
  665 + if (systemUtils.isLedOn(context)) {
  666 + LogUtils.d("input keyevent center");
  667 + ShellUtils.execCommand("input keyevent 23", false);
  668 + } else {
  669 + LogUtils.d("avoid input keyevent center");
  670 + }
663 671 }
664 672
665 673 private Runnable resumeRunnable = new Runnable() {
... ...
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <resources>
3   - <string name="app_name">方糖</string>
  3 + <string name="app_name">青柠UMS</string>
4 4 <string name="ip_promote">IP</string>
5 5 <string name="usr_promote">用户名</string>
6 6 <string name="pwd_promote">密码</string>
... ... @@ -12,7 +12,7 @@
12 12 <string name="setting">设置</string>
13 13 <string name="test">G</string>
14 14 <string name="abc">键盘</string>
15   - <string name="greeting_words">欢迎来到方糖</string>
  15 + <string name="greeting_words">Welcome ,have a nice day</string>
16 16 <string name="search">搜索</string>
17 17 <string name="play_list">观看记录</string>
18 18 <string name="main_actor">主演</string>
... ... @@ -101,7 +101,7 @@
101 101 <string name="sort_by_demand">按点播量排序</string>
102 102 <string name="room_closed">房间已锁定</string>
103 103 <string name="rating">豆瓣评分:</string>
104   - <string name="unauthorized_promote">该设备没有获取授权,点确定可以退出,如需相应的授权请联系方糖相关工作人员.</string>
  104 + <string name="unauthorized_promote">该设备没有获取授权,点确定可以退出,如需相应的授权请联青柠UMS相关工作人员.</string>
105 105 <string name="no_auth">此机器未被注册,请联系青柠客服!</string>
106 106 <string name="pre_ads_times">映前广告次数</string>
107 107 <string name="set_sm_light">设置智能灯光</string>
... ...
Please register or login to post a comment