How to regain Access on a Activity after sending i

2019-05-17 08:05发布

With Espresso I try to test sending an Activity to background, with the Home button and then getting it up in the foreground again to make some checks:

@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()));
}

I had to use intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); which was suggested by an exception, but apart of that I also tested, starting it as the Launcher Activity, or using FLAG_ACTIVITY_REORDER_TO_FRONT, but the view is not visible. Even though the test passes.

3条回答
贼婆χ
2楼-- · 2019-05-17 08:36

You can do this using UI Automator (you can use both espresso and UI Automator together).

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

This backgrounded my app and brought it to the foreground

查看更多
兄弟一词,经得起流年.
3楼-- · 2019-05-17 08:43

Ok I figured it out. First it is necessary to use the Activity Context provided by getActivity, and then I could use intents to send the activity in background and in foreground, using the HOME category and the FLAG_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
}
查看更多
时光不老,我们不散
4楼-- · 2019-05-17 08:52

Please consider this response as it works 100% when you want to goBackgroundByClickingHomeThenGetBackToTheApp.

UiDevice device = UiDevice.getInstance(getInstrumentation());
        device.pressHome();
        device.pressRecentApps();
        device.findObject(new UiSelector().text(getTargetContext().getString(getTargetContext().getApplicationInfo().labelRes)))
                .click();
查看更多
登录 后发表回答