• 老李推荐:第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注入到系统窗口里面来实现注入一个按键事件的操作。
  • 相关阅读:
    mybatis框架-用类映射返回结果
    ArrayLLis 线程不安 实验
    快速求幂运算笔记
    nyoj 56 阶乘中素数的个数
    求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2
    synchronize学习
    nyoj 找球号三(除了一个数个数为基数,其他为偶数,编程之美上的)
    递归判断一个数是否递增
    快速排序c++
    x&-x
  • 原文地址:https://www.cnblogs.com/poptest/p/5086361.html
Copyright © 2020-2023  润新知