Как автоматически проверять поведение в режиме Resume, вызывая onDestroy с помощью Robotium?

Я использую Robotium для функционального тестирования Android-приложения. Я бы хотел проверить поведение onResume после вызова onDestroy. Этот пост подсказывает, как использовать 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) 

У вас здесь две проблемы, первая проблема заключается в том, что методы инструментализации callactivityondestroy требуют, чтобы вы вызывали ее из основного потока. См. Советы по использованию runOnUiThread для получения подробной информации о том, как это сделать.

Вторая проблема заключается в том, что (и, может быть, я ошибаюсь здесь) никогда не предполагается переходить от onDestroy к onResume. http://developer.android.com/reference/android/app/Activity.html говорит, что после ondestroy деятельность буквально разрушена , Вам нужно будет создать новый экземпляр активности, чтобы получить еще один onResume. Вы можете сделать это, снова запустив свою деятельность. Я полагаю, вы могли бы сделать это по-своему, но я не уверен, насколько это было бы правильно, если бы вы хотели сделать это таким образом, просто вызовите onResume так же, как onDestroy, как указано в вопросе, к которому я привязан.

Я не думаю, что вы можете возобновить деятельность, которая уже уничтожена. Если ваша активность не уничтожена, а только остановлена, вы можете перезапустить ее и возобновить. 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. } 

Вы можете имитировать изменение конфигурации следующим образом:

  getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { activity.recreate(); } }); setActivity(null); activity = getActivity(); 

Это приведет к созданию нового экземпляра создаваемой деятельности и правильному правилу жизненного цикла (включая передачу пакета для восстановления из новой активности). Обратите внимание, что это работает только в Honeycomb (уровень API 11) и выше.

Благодарю. Я добавил и назвал это.

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