Как восстановить доступ к действию после отправки его в фоновый режим


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

@EspressoTest
public void test() {
    onSomeView().check(matches(isDisplayed()));
    getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_HOME);

    Context context = getInstrumentation().getTargetContext();
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);

    onSomeView().check(matches(isDisplayed()));
}

Я должен был использовать intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);, который был предложен исключением, но помимо этого я также протестировал, запустив его как активность запуска, или используя FLAG_ACTIVITY_REORDER_TO_FRONT, но вид не виден. Даже несмотря на то, что тест проходит.

3 3

3 ответа:

Пожалуйста, рассмотрите этот ответ, поскольку он работает на 100%, когда вы хотите goBackgroundByClickingHomeThenGetbacktotheapp.

UiDevice device = UiDevice.getInstance(getInstrumentation());
        device.pressHome();
        device.pressRecentApps();
        device.findObject(new UiSelector().text(getTargetContext().getString(getTargetContext().getApplicationInfo().labelRes)))
                .click();

Хорошо, я понял это. Сначала необходимо использовать контекст действия, предоставляемый getActivity, а затем я мог бы использовать intents для отправки действия в фоновом режиме и на переднем плане, используя категорию HOME и ФЛАГ_ACTIVITY_REORDER_TO_FRONT:

private void goHome(Activity activity) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    activity.startActivity(intent);
}

private void bringToForeground(Activity activity) {
    Intent intent = new Intent(activity, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    activity.startActivity(intent);
}

@EspressoTest
public void test() {
    //do some ui stuff to ensure the activity is up and running
    goHome(getActivity());
    // eventually sleep, or implement an idling resource
    bringToForeground(getActivity());
    // do some ui tests
}

Вы можете сделать это с помощью UI Automator (вы можете использовать как espresso, так и UI Automator вместе).

val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.pressHome()
device.pressRecentApps()
val selector = UiSelector()
val recentApp = device.findObject(selector.descriptionContains("App Description"))
recentApp.click()

Это послужило фоном для моего приложения и вывело его на передний план