如何在Android自动化活动中触发Java KeyEvent?

时间:2014-04-02 16:12:54

标签: java android keylistener keyevent event-listener

我在我的基础测试类中声明了以下KeyEvents,用于我在Android设备上运行的自动化套件。

private static final KeyEvent pressPowerDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POWER);
private static final KeyEvent pressPowerUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_POWER);

然后我弄清楚Android Test上下文中正在运行的活动,并将该上下文强制转换为活动来触发事件:

if (_context instanceof Activity) {
    Activity activity = (Activity) _context;
    activity.dispatchKeyEvent(pressPowerDown);
    activity.dispatchKeyEvent(pressPowerUp);

在自动化期间检查设备时,上面提到的KeyEvent不会触发。 我读到了关于KeyListenerssimulating KeyEvents的内容,但我想在这里做的并不完全属于这些类别中的任何一个(不使用Robot,而是使用自己的Activity的内部测试框架)

我最初的想法是我需要重新调整活动的重点,但现在我开始认为我需要某种KeyListener,我不确定放在哪里,因为这是一个测试套件,而不是接口类;它根本没有与之相关的任何接口!

如果有人知道如何在其他程序中创建和激活KeyEvents,那么我们无法访问其内部机制(内部测试工具无法修改 - 只有当前测试套件的运行状态) ,非常感谢。

编辑:我测试过看看KeyEvent是否在尝试触发三次后被消耗掉了:

System.out.println("Was the event consumed? " + activity.dispatchKeyEvent(pressPowerUp))

它从未被解雇,让我相信我们需要某种倾听者。如果有人知道如何在类中实现一个监听器,或者我是否允许声明一个监听器类并覆盖" dispatchKeyEvent"方法,它是一个很好的帮助。

1 个答案:

答案 0 :(得分:1)

答案实际上有点复杂,但也不算太糟糕,一旦我从其他开发者那里获得了更好的反馈。请参阅解释here,但对于那些不想离开页面的人,基本上这样做:

import java.lang.Process;
import java.lang.Runtime;

// your code here
String keyPower = "input keyevent " + KeyEvent.KEYCODE_POWER;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyPower);

简单,但无论重点是什么活动,都可以完成。