我在我的基础测试类中为我在 Android 设备上运行的应用程序自动化套件声明了以下 KeyEvents。
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 测试上下文中运行的 Activity ,并将该上下文转换为 Activity 以触发事件:
if (_context instanceof Activity) {
Activity activity = (Activity) _context;
activity.dispatchKeyEvent(pressPowerDown);
activity.dispatchKeyEvent(pressPowerUp);
在自动化过程中检查设备时,上述 KeyEvent 不会触发。 我读到了 KeyListeners和 simulating KeyEvents ,但我想在这里做的并不完全属于这些类别中的任何一个(不使用 Robot,而是一个具有自己的 Activity 的内部测试框架)。
我最初的想法是我需要重新调整 Activity 的重点,但现在我开始认为我需要某种 KeyListener,鉴于这是一个测试套件,我不确定该放在哪里,而不是接口(interface)类;它根本没有任何与之关联的接口(interface)!
如果有人知道如何在其他程序中创建和触发 KeyEvents,假设我们无法访问它们的内部机制(无法修改内部测试工具 - 只能修改当前测试套件的运行状态),它将不胜感激。
编辑:我测试了 KeyEvent 在尝试触发 3 次后是否被消耗:
System.out.println("Was the event consumed? " + activity.dispatchKeyEvent(pressPowerUp))
它从未被解雇,这让我相信我们需要某种倾听者。如果有人知道如何在类中实现监听器,或者如果我可以声明监听器类并覆盖“dispatchKeyEvent”方法,那将是一个很大的帮助。
最佳答案
答案实际上有点复杂,但还算不错,因为我从其他开发人员那里得到了一些更好的反馈。看解释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);
简单,但无论关注什么 Activity ,它都能完成。
关于java - 如何在 Android 自动化 Activity 中触发 Java KeyEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817235/