在Android开发者文档中标题为“添加状态管理测试”的Testing Fundamentals和Activity Testing部分中,它建议使用以下命令重新启动测试活动:
mActivity.finish();
mActivity = this.getActivity();
通过在上面两个语句之间添加一个休眠来尝试这个,我可以看到当执行mActivity = this.getActivity()时,屏幕上没有重绘活动。我的测试似乎有效,但我很感兴趣为什么不在屏幕上重新绘制Activity,因为API文档中似乎没有提到。
我很感激任何人都能给予的洞察力。调用finish()方法时,Activity会从屏幕上消失,但在调用this.getActivity()时不会重新出现。我也尝试在getActivity()之后添加一个mActivity.setVisible(true),但这没有帮助。
我的代码段现在是:
...
mActivity.finish();
Thread.sleep(5000);
mActivity = this.getActivity();
Thread.sleep(5000);
...
我进行了广泛的搜索,但是在调用getActivity()时找不到为什么Activity不再出现的任何解释。
我在Android 2.3.5,2.3.3和2.2.2上测试了这一点,结果相同。
答案 0 :(得分:8)
类ActivityInstrumentationTestCase2似乎需要一个额外的finish方法,其中必须进行一些清理。同时,您可以通过在完成活动后清理自己来解决此问题。所以改变你的代码如下:
mActivity.finish();
setActivity(null);
mActivity = this.getActivity();
这可以解释如下。 ActivityInstrumentationTestCase2类中的方法getActivity调用setActivity(a)
public T getActivity() {
Activity a = super.getActivity();
if (a == null) {
// set initial touch mode
getInstrumentation().setInTouchMode(mInitialTouchMode);
final String targetPackage =
getInstrumentation().getTargetContext().getPackageName();
// inject custom intent, if provided
if (mActivityIntent == null) {
a = launchActivity(targetPackage, mActivityClass, null);
} else {
a = launchActivityWithIntent(targetPackage,
mActivityClass,
mActivityIntent);
}
setActivity(a);
}
return (T) a;
}
方法setActivity设置内部变量mActivityIntent。
public void setActivityIntent(Intent i) {
mActivityIntent = i;
}
第一次调用之后的所有调用现在将使用新值mActivityIntent而不是null值。结果
a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent);
将被调用。可能你的应用程序无法以此意图启动。
请注意,方法rearDown会进行适当的清理:
protected void tearDown() throws Exception {
// Finish the Activity off (unless was never launched anyway)
Activity a = super.getActivity();
if (a != null) {
a.finish();
setActivity(null);
}
}