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

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,否则它将返回旧的,而不是寻找新的缓存.

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