【问题标题】:Lifecycle Testing: Restarting without onDestroy()生命周期测试:不使用 onDestroy() 重启
【发布时间】: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);
    }
}

注释掉的代码会停止并重新启动活动,但会调用所有onPauseonStoponDestroy

(如果您想对此进行评估,请转至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 捕获。

标签: android android-testing


【解决方案1】:

我不确定您所说的测试活动是什么意思。但是如果你想重启你的Activity,那么下面的代码应该可以正常工作。

解决方案 1:

/**
 * Restarts the activity
 * @param context context
 */
public static void restartApp(final Context context){
    Intent restart = context
            .getPackageManager()
            .getLaunchIntentForPackage(context.getPackageName());
    restart.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    context.startActivity(restart);
}

解决方案 2: 使用Activityrecreate 方法

查看以下链接了解更多详情

Source

【讨论】:

  • 感谢您的解决方案。在源代码中,它说“当前实例将经历其生命周期到 onDestroy()”。这是我想避免的。不过,解决方案 1 可能会奏效。
  • @user1587329 我个人使用方案一,希望对你有用。
  • 解决方案 1 有效。非常感谢你。 final Context 很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2019-02-12
相关资源
最近更新 更多