4

知道为什么将 HOME 键发送到在 Instrumentation 下运行的应用程序什么都不做吗?

import android.app.Instrumentation;
import android.view.KeyEvent;

public class MyInstrumentation extends Instrumentation {

  public void sendKeys() {
    // Works reliably
    this.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

    // Does nothing, nothing is printed to logcat
    this.sendKeyDownUpSync(KeyEvent.KEYCODE_HOME);
  }
}

这在使用Robotium以及直接使用Instrumentation时是相同的。在模拟器和无根设备上的行为是相同的。

4

2 回答 2

10

主页按钮在仪器中不起作用,即使这样做也会让您处于不太有利的位置。Android Instrumentation 只能检测它自己的进程,这意味着一旦它被发送出去,您将无法返回到您的应用程序,而且可能更糟糕的是有点不确定,因为如果感觉如此,Android 将能够关闭您的进程这将导致您的测试结束。

不过,这对你没有多大用处,不是吗?我怀疑您正在尝试测试与可以在此处看到的活动生命周期有关的内容。这可以通过仪器进行测试,但不能以您希望的简单方式进行测试。如果您查看检测类的 API 文档(此处),您会看到很多有用的方法,形式为 callActivityXXX(Activity activity),其中 XXX 匹配您要执行的生命周期事件。

使用这些方法比我怀疑你会喜欢的家庭重新启动要辛苦一些,但它允许你将测试分解到较低的级别,以确保你的应用程序在每个阶段都做正确的事情,这将使它更健壮随着时间的推移(比如说测试它保存它的状态 onPause 并在 onResume 再次正确加载它)。

使用仪器进行测试的下一个最简单的方法取决于您是否使用模拟器,如果这仅在模拟器上运行,您可以使用方向命令:

solo.setActivityOrientation(Solo.LANDSCAPE);
solo.setActivityOrientation(Solo.PORTRAINT);

这将导致您的活动被破坏并恢复测试活动生命周期的一些但不是所有状态。

于 2014-08-12T11:06:45.763 回答
2

我不相信 HOME 键可以模拟或以编程方式执行。据我了解,这纯粹是应用程序不参与的特定于框架的事件。我知道如果你要覆盖onKeyDown()你将永远不会意识到KeyEvent.KEYCODE_HOME

我相信您可以使用类别 CATEGORY_HOME 启动 Intent,但我还没有尝试过。

或者,如果您正在尝试测试活动生命周期之类的东西,也许您可​​以模拟配置更改;比如方向改变。或者,如果您只关心停止 Activity,也许您可​​以调用this.finish()where thisis Activity。

于 2014-08-12T06:21:00.317 回答