老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

 

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。

在事件生成并放入到命令队列后,Monkey类的runMonkeyCycles就会去调用相应事件源的getNextEvent来获的事件来执行事件注入,那么这一小节我们通过MonkeyKeyEvent这个事件的注入方法来看下事件注入过程是怎么样的。

往系统注入按键事件最终是通过调用InputManager提供的方法来实现的,在Android系统中,按键事件是由InputManager来收集并由WindowManagerService服务来分发给各个Activity处理的,这个系统服务。它是用于管理整个系统的输入部分,包括键盘、鼠标、触摸屏等等。所以MonkeyKeyEvent往系统注入按键事件要做的事情就是要准备好InputManager注入事件的方法 injectInputEvent所需要的参数KeyEvent实例。而KeyEvent实例或者用于构建KeyEvent实例所需要用到的参数在MonkeyKeyEvent的成员变量中都有定义:

27 public class MonkeyKeyEvent

28   extends MonkeyEvent

29 {

30   private int mDeviceId;

31   private long mEventTime;

32   private long mDownTime;

33   private int mAction;

34   private int mKeyCode;

35   private int mScanCode;

36   private int mMetaState;

37   private int mRepeatCount;

38   private KeyEvent mKeyEvent;

代码6-7-1 MonkeyKeyEvent 成员变量

以下我们先简要描述下各个成员变量的意义,其中大部分变量都是用于构建KeyEvent用的:

  • mDeviceId: 产生该事件的设备ID
  • mEventTime:事件发生事件
  • mDownTime: 按键按下时间,用来判断是点击还是长按
  • mAction: 按键动作,如ACTION_DOWN,ACTION_UP或ACTION_MULTIPLE
  • mKeyCode: 按键键码
  • mScanCode: 按键硬件扫描码
  • mMetatState: 指示哪个元键(如ALT这种控制类键)在按下状态
  • mRepeatCount:代表按键键码的重复次数
  • mKeyEvent: 系统按键事件。以上的变量在按键事件KeyEvent类中都有对应的变量

MonkeyKeyEvent支持多个构造函数,其中有两个比较重要。调用者可以传入除mKeyEvent外的所有其他变量进行初始化,也可以直接传入一个KeyEvent实例进行初始化,因为刚才说过了KeyEvent里面包含了所有其他变量。我们往下看下者两个构造函数:

46   public MonkeyKeyEvent(long downTime, long eventTime, int action, int keyCode, int repeatCount, int metaState, int device, int scan    Code)

47   {

48     super(0);

49     this.mDownTime = downTime;

50     this.mEventTime = eventTime;

51     this.mAction = action;

52     this.mKeyCode = keyCode;

53     this.mRepeatCount = repeatCount;

54     this.mMetaState = metaState;

55     this.mDeviceId = device;

56     this.mScanCode = scanCode;

57   }

58

59   public MonkeyKeyEvent(KeyEvent e) {

60     super(0);

61     this.mKeyEvent = e;

62   }

代码6-7-2 MonkeyKeyEvent构造函数

在准备好注入事件所需要的提供的信息后,下一步就需要去看下MonkeyKeyEvent的注入事件这个方法是怎么实现的了:

99     @Override

100     public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) {

101         if (verbose > 1) {

102             String note;

103             if (mAction == KeyEvent.ACTION_UP) {

104                 note = "ACTION_UP";

105             } else {

106                 note = "ACTION_DOWN";

107             }

108

109             try {

110                 System.out.println(":Sending Key (" + note + "): "

111                         + mKeyCode + "    // "

112                         + MonkeySourceRandom.getKeyName(mKeyCode));

113             } catch (ArrayIndexOutOfBoundsException e) {

114                 System.out.println(":Sending Key (" + note + "): "

115                         + mKeyCode + "    // Unknown key event");

116             }

117         }

118

119         KeyEvent keyEvent = mKeyEvent;

120         if (keyEvent == null) {

121             long eventTime = mEventTime;

122             if (eventTime <= 0) {

123                 eventTime = SystemClock.uptimeMillis();

124             }

125             long downTime = mDownTime;

126             if (downTime <= 0) {

127                 downTime = eventTime;

128             }

129             keyEvent = new KeyEvent(downTime, eventTime, mAction, mKeyCode,

130                     mRepeatCount, mMetaState, mDeviceId, mScanCode,

131                     KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD);

132         }

133         if (!InputManager.getInstance().injectInputEvent(keyEvent,

134             InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_RESULT)) {

135             return MonkeyEvent.INJECT_FAIL;

136         }

137         return MonkeyEvent.INJECT_SUCCESS;

138     }

139 }

代码6-7-3 MonkeyKeyEvent - injectEvent

  • 103-107行: 确定这个按键事件是按下事件还起弹起事件
  • 119-132行: 如果MonkeyKeyEvent是用KeyEvent构造的,那么直接使用这个KeyEvent,如果不是用KeyEvent而是用另外一个构造函数构造的,那么用该构造函数传进来的所有参数来构造一个KeyEvent来使用
  • 133-134行: 通过调用InputManager来把按键keyEvent注入到系统窗口里面来实现注入一个按键事件的操作。

老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例的更多相关文章

  1. 第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    在事件生成并放入到命令队列后,Monkey类的runMonkeyCycles就会去调用相应事件源的getNextEvent来获的事件来运行事件注入,那么这一小节我们通过MonkeyKeyEvent这个 ...

  2. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  3. 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态

    老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态   poptest是国内唯一 ...

  4. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  5. 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化

    老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...

  6. 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

    老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述   HierarchyViewer库的引入让M ...

  7. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  8. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  9. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

随机推荐

  1. HR从业者的下一个十年该怎么做?

    众所周知,目前我们所处的以互联网为代表的新经济时代,有两个重要的特征一是客户价值至上,二是人力资本主权.围绕这两个基本特征,我们需要重新架构我们的商业模式和创新人力资源管理思维.模式.工具和方法. 人 ...

  2. 实现 $.extend 的深复制和浅复制

    $.extend 是jquery常用的一个方法,该方法通过传第一个布尔型参数可以指定为深复制还是浅复制,如何使用不在本文讨论. 先来理解下什么是深复制: var ob1 = {'name' : 'Ja ...

  3. Spring Mvc + Easyui中根据查询结果导出文件

    项目是典型的SpringMvc + Easyui,需求是前台页面根据查询条件导出生成CSV文件. 基本流程是:前台页面通过表单提交的方式,请求后台,后台接受到查询参数,根据查询参数查询到数据集合,最后 ...

  4. 解决Ubuntu不能连接xshell

    首先,判断Ubuntu是否安装了ssh服务: 1.ps -e |grep ssh 如果服务已经启动,则可以同时看到“ssh-agent”和“sshd”,否则表示没有安装服务,或没有开机启动 2.安装s ...

  5. iOS开发学习路径的一些建议

    结合自己情况聊下iOS学习建议,这里不讲大道理,说说具体怎么做.欢迎大家拍砖. 1.第一点要求 ,能比较顺畅的阅读官方的文档 如果你连官方的文档读起来都非常困难,那你还谈什么提高和进阶,咱们学习iOS ...

  6. 浅谈Jasmine的安装和拆卸

    单元测试中,我们通常需要在执行测试代码前准备一些测试数据,建立测试场景,这些为了测试成功而所做的准备工作称为Test Fixture.而测试完毕后也需要释放运行测试所需的资源.这些铺垫工作占据的代码可 ...

  7. php和js中,utf-8编码转成base64编码

    1.php下转化base64编码 php中,文本文件的编码决定了程序变量的编码,比如以下代码在不同编码的php文件中,展示的效果也是不一样的 <?php $word = '严'; echo ba ...

  8. 项目架构开发:数据访问层之Repository

    接上文 项目架构开发:数据访问层之Logger 本章我们继续IRepository开发,这个仓储与领域模式里边的仓储有区别,更像一个工具类,也就是有些园友说的“伪仓储”, 这个仓储只实现单表的CURD ...

  9. 删除bin后,Eclipse重新编译项目

    今天做"用java.util.Properties类读写配置文件"Demo时,在编译项目时由于配置资源文件一起写入bin了.而Demo修改了配置文件,从新运行时配置文件不再更新,于 ...

  10. J2ee技术难点

    J2ee技术难点 session/cookie区别联系 jsp/servlet区别联系 filter执行流程 openSessionInView原理 clone与servilizable区别联系 eq ...