第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
来源:互联网 发布:女生围巾品牌 知乎 编辑:程序博客网 时间:2024/06/02 03:07
在事件生成并放入到命令队列后,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 @Override100 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章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览
- 第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
- 第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
- 第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
- 第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
- 第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
- 第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
- 第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源(原创)
- 第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles(原创)
- 第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览(原创)
- 第5章1节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 官方简介(原创)
- 第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本(原创)
- Monkey源码分析之事件注入
- 【android】Monkey源码分析、事件注入
- Monkey源码分析之事件注入
- Monkey源码分析之事件源
- Monkey源码分析之事件源
- elasticsearch2.0学习之路(一)es在linux中的安装和集群配置
- 第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
- C语言程序设计整理(2)
- 4.3.4 磁盘组织与管理
- sublime 调用 shell
- 第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
- iOS拨打电话
- 第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
- android Service onStartCommand intent为nullhttp://hold-on.iteye.com/blog/2024926
- mysql 创建表时以UTF8编码
- C#的Activator.CreateInstance方法
- git版本控制开发流程小结笔记(一)
- linux SVN服务器创建版本库
- servlet向jsp传数据