问题
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.
回答1:
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();
回答2:
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
}
回答3:
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
来源:https://stackoverflow.com/questions/23293301/how-to-regain-access-on-a-activity-after-sending-it-to-background