老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第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原理分析-事件源-事件源概览-注入按键事件实例的更多相关文章
- 第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
在事件生成并放入到命令队列后,Monkey类的runMonkeyCycles就会去调用相应事件源的getNextEvent来获的事件来运行事件注入,那么这一小节我们通过MonkeyKeyEvent这个 ...
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...
- 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态
老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态 poptest是国内唯一 ...
- 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...
- 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化
老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...
- 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述
老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述 HierarchyViewer库的引入让M ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
- 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结
老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...
随机推荐
- 一个不错的windows编程网址
http://www.zklmc.com/ 含有MFC,C#,web开发资料
- .Net异步编程知多少
1. 引言 最近在学习Abp框架,发现Abp框架的很多Api都提供了同步异步两种写法.异步编程说起来,大家可能都会说异步编程性能好.但好在哪里,引入了什么问题,以及如何使用,想必也未必能答的上来. 自 ...
- Hibernate一对一外键映射
Hibernate 一对一外键映射 ------------------------------ ----- ...
- YARN学习笔记(一)——YARN的简介
YARN的简介 什么是YARN MRv1的架构和缺陷 经典MapReduce的局限性 解决可伸缩性问题 YARN的架构 一个可运行任何分布式应用程序的集群 YARN中的应用程序提交 YARN的其他特性 ...
- Spring+CXF的WebServices简单示例
本文就最简单的WebServices示例来演示Spring和CXF的整合. 使用Maven创建webapp项目,pom如下 <properties> <cxf.version> ...
- js实现Mac触摸板双指事件(上、下、左、右、放大、缩小)
前言 这几天在修复一个web问题时,需要捕获Mac触摸板双指事件(上.下.左.右.放大.缩小),但发现并没有现成的轮子,还是要自己造. 例如:jquery.mousewheel.js(添加跨浏览器的鼠 ...
- OpenFlow硬件交换机制作及刷机教程
1.目的 将普通路由器升级成为一台支持OpenFlow的交换机. 具体哪些路由器可以刷OpenFlow可以参考:OpenWRT:http://wiki.openwrt.org/toh/start#su ...
- APUE学习心得
APUE学习心得 Chapter 3 IO 3.2 文件描述符 文件描述符是一个非负整数.当打开 一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符.0 标准输入,1 标准输出, 2 标准错 ...
- 3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二
3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 21 Solved ...
- VueJs学习路线
对于这个东西,我本人也是初学者,收集一些学习资源的链接,用于个人资源的学习,也分享给大家 lavyun的博客 里面有一些给初学者的建议,学习路线 http://www.cnblogs.com/smar ...