18

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

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

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

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


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

getInstrumentation().waitForIdleSync()

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

4

5 回答 5

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

活动生命周期图引用官方开发指南: 在此处输入图像描述

于 2012-04-24T22:51:27.460 回答
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 的片段的新实例,并且该 Activity 和片段都以预期的方式恢复它们的状态。

我不知道这是如何工作的,也不知道为什么会这样,我通过反复试验达到了这个解决方案,我只在运行 KitKat 的 Nexus 4 上对其进行了测试。我不能保证它正确地模拟了一个活动游戏,但它适用于我的目的。

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

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

于 2014-01-14T11:40:06.370 回答
2

测试生命周期事件的一个好方法是通过屏幕方向更改。以我的经验,这是一种对 onPause / onStart 模式进行防弹的便捷方式。

于 2012-04-24T12:28:10.933 回答
0

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

于 2012-04-24T12:20:44.083 回答
0

更改您的代码如下:

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

完整的解释可以在这个问题中找到

于 2013-01-22T13:08:26.360 回答