问题的原因是:
- 没有 Android API 可以获取堆栈中所有活动的列表。
- (1) 的解决方法是使用 ActivityMonitor 来跟踪每个启动的 Activity。
Robotium 使用了解决方法,但它会在您的 ActivityInstrumentationTestCase2 测试用例开始其活动之后设置其 ActivityMonitor,即:
Activity activity = getActivity();
Solo solo = new Solo(getInstrumentation(), activity);
如果您的被测活动是转发活动,那么它很可能在 Solo 注册其 ActivityMonitor 之前启动目标活动。Solo.finishOPenedActivities() 依赖于它从其 ActivityMonitor 收集的列表。
根据@Guillaume 的回答,我从测试用例或从 tearDown() 调用此方法:
private void backOutToHome() {
boolean more = true;
while(more) {
try {
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
} catch (SecurityException e) { // Done, at Home.
more = false;
}
}
}