我正在使用Robotium对Android应用进行功能测试。我想在调用onDestroy之后测试onResume行为。 This post提示使用Instrumentation,但我无法使用它。 我已经包含以下内容,但是这会因IllegalStateException而失败。 是否有可能破坏应用程序并重新启动它?
public class MainActivityFunctionalTest extends ActivityInstrumentationTestCase2<MainActivity> {
private Solo solo;
public MainActivityFunctionalTest() {
super(MainActivity.class);
}
public void testActionList() {
getInstrumentation().callActivityOnDestroy(solo.getCurrentActivity());
...
}
导致以下异常:
java.lang.IllegalStateException: Must be called from main thread of process at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1373) at android.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1825) at android.app.Activity.performDestroy(Activity.java:5171) at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1109) at nl.handypages.trviewer.test.MainActivityFunctionalTest.testActionList(MainActivityFunctionalTest.java:81) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199) at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
答案 0 :(得分:2)
我认为你不能恢复已被销毁的活动。如果您的活动未被销毁,但只是停止,那么您可以重新启动并恢复它。需要在UI线程上调用OnResume,因此假设您想在活动运行后测试恢复状态,您可以这样做:
@UiThreadTest
public void testResumeAfterStop() {
Instrumentation instr = this.getInstrumentation();
// here, test or record down whatever should be tested
// when the activity is in resume state the first time
instr.callActivityOnPause(getActivity());
instr.callActivityOnStop(getActivity());
instr.callActivityOnRestart(getActivity());
instr.callActivityOnStart(getActivity());
instr.callActivityOnResume(getActivity());
// Now you are in the resume state again.
// Test whatever you need here.
}
答案 1 :(得分:2)
您可以模拟这样的配置更改:
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
activity.recreate();
}
});
setActivity(null);
activity = getActivity();
这将导致创建活动的新实例,并且它应该正确地经历生命周期(包括将包恢复到新活动)。请注意,这仅适用于Honeycomb(API级别11)及更高版本。
答案 2 :(得分:1)
嗯,这里有两个问题,第一个问题是检测callactivityondestroy方法需要你从主线程中调用它。有关如何执行此操作的详细信息,请参阅runOnUiThread usage tips。
第二个问题是(我可能在这里错了)从来没有想过从onDestroy转到onResume http://developer.android.com/reference/android/app/Activity.html说在ondestroy之后,活动被彻底摧毁了。您必须创建活动的新实例才能获得另一个onResume。你可以再次发起你的活动。我想你可以按照自己的方式去做,但我不确定它有多有效,如果你想以这种方式做到这一点,只需按照onDestroy的方式调用onResume,如我所链接的问题中所述。
答案 3 :(得分:1)
感谢。我添加并称之为。
public void callActivityOnDestroy(final Activity activity){
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
activity.finish();
}
});
}
public void callActivityStart(final Activity activity){
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
activity.startActivity(new Intent(activity, MainActivity.class));
}
});
}
另外(在我的情况下)我可以打电话(如果我不想完成杀死过程):
getInstrumentation().callActivityOnStop(getActivity());
getInstrumentation().callActivityOnRestart(getActivity());