Отключение первого запуска приветствия на свежем эмуляторе Android

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

Проблема в том, что когда я запускаю тест на новом эмуляторе (я использую Travis CI, но его можно легко воспроизвести на моем домашнем ПК), эмулятор запускается с оверлеем "первый запуск". Который блокирует мой код uiautomator от правильного запуска приложения.

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

Есть ли гарантированный способ отключить этого приветствия? Некоторое предпочтение может быть или просто пример кода, который надежно убьет приветствующего.

2 ответа

Решение

Видимо, встречающий называется "цепляться". При поиске хотя (довольно старого) кода я обнаружил следующее:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.2_r1/com/android/launcher2/Launcher.java#Launcher.isClingsEnabled%28%29

private boolean isClingsEnabled() {
    // TEMPORARY: DISABLE CLINGS ON LARGE UI
    if (LauncherApplication.isScreenLarge()) return false;
    // disable clings when running in a test harness
    if(ActivityManager.isRunningInTestHarness()) return false;
    return true;
}

И следующая остановка isRunningInTestHarness() по адресу http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.2_r1/android/app/ActivityManager.java#ActivityManager.isRunningInTestHarness%28%29

public static boolean isRunningInTestHarness() {
    return SystemProperties.getBoolean("ro.test_harness", false);
}

Что в свою очередь приводит к adb shell setprop ro.test_harness true, Который просто работает.

Вы пытались использовать PackageManager.getLaunchIntentForPackage (..)? Это позволит вам отправить то же намерение, которое использует модуль запуска для запуска вашего приложения. Это должно быть эквивалентно нажатию на значок запуска вашего приложения.

Если вам нужно пройти через панель запуска, вы можете использовать UiWatcher, чтобы отклонить оверлей при первом запуске. Всякий раз, когда UiAutomator не может найти элемент, он вызывает метод checkForCondition(..) для каждого зарегистрированного UiWatcher и дает вам возможность отклонить любые помехи или диалоги, которые мешают.

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