我正在尝试编写停止(onPause()
,然后onStop()
)并重新启动当前活动的Android活动检测测试。我试过了
activity.finish();
activity = getActivity();
......但这似乎无法正常工作。
测试的目标是声明表单数据在onPause()
方法期间存储并在onStart()
方法期间重新读取。它在手动执行时有效,但测试失败,我从中得出结论activity.finish()
似乎是阻止和重新启动活动的错误方法。
编辑:我的主要问题似乎是同步问题。重新启动活动后,测试运行器不会等待所有事件处理程序完成。以下行将暂停测试执行,直到活动空闲:
getInstrumentation().waitForIdleSync()
除此之外,请查看已接受的答案,以获取有关生命周期的更多有价值信息。
答案 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);
活动生命周期图引自官方开发指南:
答案 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();