Кнопка Android Instrumentation HOME

Есть идеи, почему отправка ключа 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. Поведение одинаково на эмуляторе и устройстве без рута.

2 ответа

Решение

Кнопка "Домой" не будет работать в приборах, и даже если бы она работала, она оставила бы вас в не слишком благоприятном положении. Android Instrumentation может обрабатывать только свой собственный процесс, что означает, что вы не сможете вернуться к своему приложению после его отправки, и, возможно, хуже будет слегка недетерминированным, так как Android сможет закрыть ваш процесс, если он почувствует что заставит ваши тесты закончиться.

Это не очень полезно для вас, правда? Я подозреваю, что вы пытаетесь проверить что-то связанное с жизненным циклом активности, который можно увидеть здесь. Это можно проверить с помощью контрольно-измерительных приборов, но не так просто, как хотелось бы. Если вы посмотрите на документы API для класса инструментария ( здесь), вы увидите множество полезных методов в форме callActivityXXX(Activity Activity), где XXX соответствует событию жизненного цикла, которое вы хотите выполнить.

Эти методы немного сложнее, чем домашний перезапуск. Я подозреваю, что вам это понравится, но он позволяет вам снизить уровень тестирования до более низкого уровня, чтобы гарантировать, что ваше приложение выполняет правильные действия на каждом этапе, что сделает его более надежным со временем (скажем, тест сохраняет свое состояние onPause и снова загружает его должным образом в onResume).

Следующий простой способ выполнить тестирование с помощью инструментария зависит от того, используете ли вы эмулятор или нет, если он будет запущен только на эмуляторе, вы можете использовать команды ориентации:

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

Это приведет к тому, что ваша активность будет уничтожена и возобновлена ​​проверка некоторых, но не всех состояний жизненного цикла активности.

Я не верю, что ключ HOME может быть смоделирован или программно выполнен. Насколько я понимаю, это чисто специфическое для фреймворка событие, к которому приложения не относятся. Я знаю, если бы вы переопределить onKeyDown() что вы никогда не узнаете о KeyEvent.KEYCODE_HOME

Я считаю, что вы можете запустить Intent с категорией CATEGORY_HOME, но я не пробовал этого.

В качестве альтернативы, если вы пытаетесь протестировать что-то вроде жизненного цикла действия, возможно, вы можете смоделировать изменение конфигурации; например, изменение ориентации. Или, если вы хотите просто остановить действие, возможно, вы можете позвонить this.finish() где this это активность.

Другие вопросы по тегам