zoukankan      html  css  js  c++  java
  • 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

     

    从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行。Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种:

    • 需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系统窗口注入按键事件来完成输入请求
    • 不需要通过系统服务往系统注入事件: 如MonkeyWaitEvent只是进行简单的睡眠等待

    MonkeyEvent是所有Monkey事件的总称,其实它包含了多种事件,我们先看下类图:

     

    图6-5-1 MonkeyEvent类族谱

    大家可以看到MonkeyEvent是一个抽象类,它最重要的地方是定义了injectEvent这个抽象方法。然后有一系列的子类继承该抽象类来实现其injectEvent接口,也就是去实现如何往系统注入事件来完成MonkeyRunner的请求了。所以如果这里要给Monkey事件做一个定义,我认为可以这样定义:Monkey事件是一个实现了injectEvent方法来处理不同的命令请求的类。但这里我们要注意并不是所有从MonkeyRunner过来的命令字串都会生成对应的事件的,请看下表:

     

    命令字串

    命令翻译类

    目标事件类

    MR是否支持

    注释

    touch down x y

    TouchCommand

    MonkeyTouchEvent

     x代表x坐标,y代表y坐标

    touch up x y

    TouchCommand

    MonkeyTouchEvent

    同上

    touch move x y

    TouchCommand

    MonkeyTouchEvent

    同上

    tap x y

    TapCommand

    MonkeyTouchEvent

    同上

    press name

    PressCommand

    MonkeyKeyEvent

    Name代表按键名,如"MENU", "HOME", "SEARCH"

    key down name

    KeyCommand

    MonkeyKeyEvent

    同上

    key up name

    KeyCommand

    MonkeyKeyEvent

    同上

    getvar name

    GetVarCommand

     N/A(不会有对应事件,所以也不会加入事件队列,而是直接取得属性返回)

    name 代表属性名

    listvar 

    ListViewsCommand

    同上

     

    type line

    TypeCommand

    MonkeyKeyEvent

    line 代表输入字串

    wake

    WakeCommand

     N/A(不会有对应事件,所以也不会加入事件队列,而是直接PowerManager唤醒屏幕)

     

    listViews

    ListViewsCommand

    N/A(不会生成事件也不会入事件队列)

     

    queryview

    QueryViewCommand

    N/A(不会生成事件也不会入事件队列)

     

    getRootView

    GetRootViewCommand

    N/A(不会生成事件也不会入事件队列)

     

    getViewWithText

    GetViewsWithTextCommand

    N/A(不会生成事件也不会入事件队列)

     

    done

    N/A

    N/A(不会生成事件也不会入事件队列)

    测试完成,Monkey收到命令后会停止Socket监听

    quit

    N/A

    N/A(不会生成事件也不会入事件队列)

    测试请求退出,Monkey收到后不会停止Socket监听,

    flip open

    MonkeyFlipEvent

    MonkeyFlipEvent

    MonkeyRunner不支持发送这两个命令

    flip close

    MonkeyFlipEvent

    MonkeyFlipEvent

     

    trackball dx dy

     

     

     

    deferredReturn

    DeferReturnCommand

    N/A(不会生成事件也不会入事件队列)

    这个命令比较特别,做的事情是等待一个命令完成然后执行另外一个命令。但是在MonkeyRunner框架中并没有支持。

    : MR代表MonkeyRunner

     

    表6-5-1 命令字串 – 命令翻译类 – 事件关系参照表

    从列表中我们可以看到MonkeySourceNetwork支持大部分从MonkeyRunner过来的命令字串,但是只有2种是会生成对应的事件并存放到事件队列里面的,这两种事件都是需要对界面进行操作的,而其他如获得系统属性以及获得界面控件等命令都是不会生成对应事件,也不会进入到事件队列,而是直接处理然后返回的。这里我们对这2种事件做相应的描述:

    • MonkeyTouchEvent:对界面进行触屏操作,最终会通过InputManager往系统注入对应事件
    • MonkeyKeyEvent: 往界面输入键值,最终会通过InputManager往系统注入对应事件

    这里要注意的是,其实并不是所有的事件注入都需要真的往系统窗口注入事件的,这个接口方法的名字我觉得Google 工程师起得不好,比如叫做handleEvent就不会造成混乱了(个人见解)。

  • 相关阅读:
    转一篇:arp欺骗的原理和防御
    CF1209A Paint the Numbers
    字符串专题之KMP算法
    CF1209B Koala and Lights
    CF1217A Creating a Character
    CF1217B Zmei Gorynich
    各种模板
    开通博客园拉..
    汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单
    我也要学C语言第二十章:结构体类型变量,结构体数组
  • 原文地址:https://www.cnblogs.com/poptest/p/5083220.html
Copyright © 2011-2022 走看看