【发布时间】:2015-06-01 13:43:52
【问题描述】:
如何在不调用 onDestroy() 的情况下杀死并重新启动已测试的活动?
android系统可以在不调用onDestroy()的情况下杀死你的应用程序
(甚至在蜂窝之前没有调用onStop()),如
在极端情况下,系统可能会简单地杀死您的应用进程 没有调用活动的最终 onDestroy() 回调,所以它是 重要的是您使用 onStop() 释放可能泄漏的资源 记忆。
(见http://developer.android.com/training/basics/activity-lifecycle/stopping.html#Stop)
以下代码使应用程序停止,但不重新启动 再说一遍。它使用 Robotium 来检查活动是否开始,但任何方法都可以。
package com.testRestart;
import android.os.Bundle;
import android.test.ActivityInstrumentationTestCase2;
import com.robotium.solo.Solo;
public class RestartTest extends ActivityInstrumentationTestCase2<testactivity> {
private Solo solo;
public RestartTest() {
super("com.testRestart", testactivity.class);
}
protected void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
public void testDestroyWithoutStop() {
this.getInstrumentation().finish(23, new Bundle());// stops
// getInstrumentation().runOnMainSync(new Runnable() {
// @Override public void run() {
// // getActivity().finish();// does the same as recreate
// getActivity().recreate();
// }
//});
//setActivity(null);
//getActivity();
solo.waitForActivity(testactivity.class, 1000);
}
}
注释掉的代码会停止并重新启动活动,但会调用所有onPause、onStop 和onDestroy。
(如果您想对此进行评估,请转至Lifecycle Testing with Robotium: Killing and Restarting Activity 以获取有关如何设置活动的说明)
中止行为可能是由于Robotium living inside the application。
最好在没有onDestroy() 的情况下测试应用程序的杀戮行为,然后重新启动。
任何方法都可以做到这一点。
怎么办?
(如果这个问题有什么需要改进的地方,请编辑或 发表评论)
【问题讨论】:
-
我不熟悉 Robotium,但是,您可以在名为 shouldDestroy 的 Activity 中放置一个布尔值。覆盖 onDestroy 并且如果标志为真,则不要调用 super 或运行任何代码。在您的测试用例中,在拆除之前将标志设置为 true。
-
我没有想到这一点。不错的方法。您是否发现修改源代码以进行测试存在问题(因为这不是真正的重构)?
-
@blackcj:(Robotium 只是一个检查测试是否有效的工具。它与问题无关。)
-
@blackcj:谢谢,但这种方法给出了
android.app.SuperNotCalledException,无法通过 try-catch 捕获。