老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行了事,而有些是需要在解析后创建相应的事件类实例并添加到命令队列里面排队执行。负责这部分工作的就是命令翻译类。那么我们往下还是继续在MonkeySourceNetwork这个范畴中MonkeyCommand类是怎么一回事:
图6-3-1 MonkeyCommand族谱
图中间的MonkeyCommand是一个接口,主要定义了translateCommand这个方法,它接收的参数是一个字串命令以及参数的列表以及命令队列,所有实现类都必须实现这个方法来对命令字串进行解析翻译:
- 如果命令字串需要建立对应MonkeyEvent实例的,则将该命令字串翻译成对应的MonkeyEvent实例并加入到传进来的命令队列
- 如果命令字串不需要建立对应的MonkeyEvent实例的的,那么直接解析执行该命令字串,然后返回
命令字串格式 |
命令翻译类 |
MR是否支持 |
注释 |
touch down x y |
TouchCommand |
是 |
x代表x坐标,y代表y坐标 |
touch up x y |
TouchCommand |
是 |
同上 |
touch move x y |
TouchCommand |
是 |
同上 |
tap x y |
TapCommand |
是 |
同上 |
press name |
PressCommand |
是 |
Name代表按键名,如"MENU", "HOME", "SEARCH"等 |
key down name |
KeyCommand |
是 |
同上 |
key up name |
KeyCommand |
是 |
同上 |
getvar name |
GetVarCommand |
是 |
name 代表属性名 |
listvar |
ListViewsCommand |
是 |
|
type line |
TypeCommand |
是 |
line 代表输入字串 |
wake |
WakeCommand |
是 |
|
listViews |
ListViewsCommand |
是 |
|
queryview |
QueryViewCommand |
是 |
|
getRootView |
GetRootViewCommand |
是 |
|
getViewWithText |
GetViewsWithTextCommand |
是 |
|
done |
N/A |
是 |
测试完成,Monkey收到命令后会停止Socket监听 |
quit |
N/A |
是 |
测试请求退出,Monkey收到后不会停止Socket监听, |
flip open |
MonkeyFlipEvent |
否 |
MonkeyRunner不支持发送这两个命令 |
flip close |
MonkeyFlipEvent |
否 |
|
trackball dx dy |
否 |
||
deferredReturn |
DeferReturnCommand |
否 |
这个命令比较特别,做的事情是等待一个命令完成然后执行另外一个命令。但是在MonkeyRunner框架中并没有支持。 |
注: MR代表MonkeyRunner |
表6-3-1 命令字串和对应的命令翻译类参照表
MonkeyCommand中所有的类其实都是内部类,比如网络命令相关的命令翻译类或者是MonkeySourceNetwork的子类,或者是MonkeySourceNetworkVars的子类,不然就是MonkeySourceNetworkViews的子类:
图6-3-2 命令翻译类作为事件源的内部类
一旦事件源获取到字串命令就能很方便的通过COMMAND_MAP调用内部的命令翻译类来把命令翻译出来处理,所以我们也可以认为事件源依赖相应的命令翻译类来做事情:
图6-3-3 事件源依赖命令翻译类
下一小节我们通过一个实例去看事件翻译类是如何把MonkeyRunner发送过来的字串命令翻译出来并转换成事件实例的。