如何在android检测测试中停止并重新启动活动?

时间:2012-04-24 10:26:17

标签: android testing android-testing

我正在尝试编写停止(onPause(),然后onStop())并重新启动当前活动的Android活动检测测试。我试过了

activity.finish();
activity = getActivity();

......但这似乎无法正常工作。

测试的目标是声明表单数据在onPause()方法期间存储并在onStart()方法期间重新读取。它在手动执行时有效,但测试失败,我从中得出结论activity.finish()似乎是阻止和重新启动活动的错误方法。


编辑:我的主要问题似乎是同步问题。重新启动活动后,测试运行器不会等待所有事件处理程序完成。以下行将暂停测试执行,直到活动空闲:

getInstrumentation().waitForIdleSync()

除此之外,请查看已接受的答案,以获取有关生命周期的更多有价值信息。

5 个答案:

答案 0 :(得分:13)

通过调用(或触发屏幕方向更改):

activity.finish(); // old activity instance is destroyed and shut down.
activity = getActivity(); // new activity instance is launched and created.

导致活动经历完整的娱乐生命周期:

onPause() -> onStop() -> onDestroy() -> onCreate()

您需要的是:

onPause() -> onStop() -> onRestart()

我最近暴露了Instrumentation API并发现了很多有趣的活动生命周期触发方法callActivityOnXXX(),下面的单行代码应该做的很棘手:

MyActivity myActivity = getActivity();
// make activity falling into restart phase:
getInstrumentation().callActivityOnRestart(myActivity);

活动生命周期图引自官方开发指南: enter image description here

答案 1 :(得分:10)

我尝试调用.finish(),setActivity(null),getActivity(),它确实重新启动了活动,但对我而言,它并没有恢复状态。我在SO上尝试了所有其他答案,并且我可以在网上找到所有其他方法,而且没有一个能为我工作。经过多次实验,我发现了以下工作(nb:要求API等级11 +):

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

当我这样做时,会创建一个新的Activity实例,并且还会创建我在测试前面附加到活动的片段的新实例,并且activity和fragment都以预期的方式恢复其状态。 / p>

我不知道这是如何工作的或者为什么会这样,我通过反复试验达到了这个解决方案,而我只是在运行KitKat的Nexus 4上进行了测试。我不能保证它能正确模拟活动娱乐,但它可以用于我的目的。

编辑:稍后我想出了它的工作原理。 getActivity()通过注册接收正在创建的新活动的钩子来工作,这些钩子捕获activity.recreate()创建的新Activity。需要setActivity(null)来清除内部缓存支持getActivity,否则它将返回旧的缓存,而不是寻找新的缓存。

您可以通过检查扩展的各种测试用例类的源代码来了解其工作原理。

答案 2 :(得分:2)

测试生命周期事件的一种好方法是通过屏幕方向更改。根据我的经验,它是一种方便的方法来突破onPause / onStart模式。

答案 3 :(得分:0)

也许你可以尝试保存你的活动名称, 完成它...并使用反射为新创建的...创建.class的新实例...

答案 4 :(得分:0)

按如下方式更改您的代码:

mActivity.finish();
    setActivity(null);
    mActivity = this.getActivity();

A full explanation can be found in this question