Dan*_*gen 16 testing android android-testing
我正在尝试编写一个Android活动检测测试,停止(onPause()然后onStop())并重新启动当前活动.我试过了
activity.finish();
activity = getActivity();
Run Code Online (Sandbox Code Playgroud)
......但这似乎不能正常工作.
测试的目标是声明表单数据在onPause()方法期间存储并在方法期间重新读取onStart().它在手动执行时有效,但测试失败,我从中得出结论activity.finish()似乎是停止和重新启动活动的错误方法.
编辑:我的主要问题似乎是同步问题.重新启动活动后,测试运行器不会等待所有事件处理程序完成.以下行将暂停测试执行,直到活动空闲为止:
getInstrumentation().waitForIdleSync()
Run Code Online (Sandbox Code Playgroud)
除此之外,请查看已接受的答案,以获取有关生命周期的更多有价值信息.
yor*_*rkw 13
通过调用(或触发屏幕方向更改):
activity.finish(); // old activity instance is destroyed and shut down.
activity = getActivity(); // new activity instance is launched and created.
Run Code Online (Sandbox Code Playgroud)
导致活动经历完整的娱乐生命周期:
onPause() -> onStop() -> onDestroy() -> onCreate()
Run Code Online (Sandbox Code Playgroud)
你需要的是:
onPause() -> onStop() -> onRestart()
Run Code Online (Sandbox Code Playgroud)
我最近公开了Instrumentation API并发现了很多有趣的活动生命周期触发器方法callActivityOnXXX(),下面的单行代码应该很棘手:
MyActivity myActivity = getActivity();
// make activity falling into restart phase:
getInstrumentation().callActivityOnRestart(myActivity);
Run Code Online (Sandbox Code Playgroud)
活动生命周期图引自官方开发指南:

ZoF*_*reX 10
我尝试调用.finish(),setActivity(null),getActivity(),它确实重新启动了活动,但对我而言,它并没有恢复状态.我在SO上尝试了所有其他答案,并且我可以在网上找到所有其他方法,而且这些方法都不适合我.经过多次实验,我发现了以下工作(nb:要求API级别11+):
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
activity.recreate();
}
});
setActivity(null);
activity = getActivity();
Run Code Online (Sandbox Code Playgroud)
当我这样做时,会创建一个新的Activity实例,并且还会创建我在测试前面附加到活动的片段的新实例,并且activity和fragment都以预期的方式恢复其状态.
我不知道这是如何工作的或者为什么会这样,我通过反复试验达到了这个解决方案,我只在运行KitKat的Nexus 4上进行了测试.我无法保证它能够正确地模拟活动娱乐,但它可以用于我的目的.
编辑:在以后我发现它是如何工作的.getActivity()通过注册接收正在创建的新活动的钩子来工作,这些钩子捕获activity.recreate()创建的新Activity.setActivity(null)需要清除内部缓存支持getActivity,否则它将返回旧的,而不是寻找新的缓存.
您可以通过检查扩展的各种测试用例类的源代码来了解其工作原理.
| 归档时间: |
|
| 查看次数: |
14960 次 |
| 最近记录: |