第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
在事件生成并放入到命令队列后,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注入到系统窗体里面来实现注入一个按键事件的操作。
注:很多其它文章请关注公众号:techgogogo或个人博客http://techgogogo.com。当然,也很欢迎您直接微信(zhubaitian1)勾搭。本文由天地会珠海分舵原创。转载请自觉。是否投诉维权看心情。
第6章7节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例的更多相关文章
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionP ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...
- 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...
- 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...
- 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...
- 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串 从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
随机推荐
- [luogu P5349] 幂 解题报告 (分治FFT)
interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...
- 2015 多校赛 第一场 1001 (hdu 5288)
Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l&l ...
- Linux运维最佳实践之网站调优
高性能静态网站: 1.静态页面中针对图片进行浏览器(客户端)缓存,如公共JavaScript(jQuery,jQuery-1.12.1.min.js)进行缓存 2.对网站输入内容压缩(gzip) 3. ...
- JVM概论
引子 Java虚拟机是Java应用程序的执行环境.通常而言,JVM是由一组严格的指令集和一个复杂的内存模型来具体实现的虚拟机,它用来解释编译好的java字节码文件,将字节码转换为特定机器可以执行的本机 ...
- (转)webpack用法
前言 webpack前端工程中扮演的角色越来越重要,它也是前端工程化很重要的一环.本文将和大家一起按照项目流程学习使用wbepack,妈妈再也不用担心我不会使用webpack,哪里不会看哪里.这是一个 ...
- GCC G++ Make CMake自我科普
Linux下gcc g++ make cmake 联系和区别 C/C++程序从编写到可执行一般经历这几个阶段 编写源代码 编译器编译代码生成目标文件,如.o文件 链接器链接目标文件和其他目标文件/库文 ...
- Boost字符串处理
(1):Boost学习之格式化输出--format: 原文链接:http://www.cnblogs.com/lzjsky/archive/2011/05/05/2037327.html 此文非常详细 ...
- Virtualbox guest in KDE Neon
在最新版的KDE Neon里面装VirtualBox客户端工具,折腾了好久,时间紧的时候不得已用共享U盘的方法将就. 之前要么装完关机按钮点了没反应,要么重启进桌面后任务栏消失,再就是进去之后复制东西 ...
- oc的属性
Declared property A declared property provides a syntactical shorthand for declaring a class’s acces ...
- 应用二:Vue之ElementUI Form表单校验
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基 ...