2

我正在使用下面介绍的方法来验证我正在测试的活动是否开始另一个活动。

Instrumentation.addMonitor (IntentFilter filter, Instrumentation.ActivityResult result, boolean block)

根据文档, block 参数控制监视器是否应该阻止活动开始(返回其预设结果)。这就是我想要实现的 - 我想将 AcitivityResult 返回到调用活动:onActivityResult()。我使用的代码如下:

Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putLong(ActivityBundleKeys.KEY_TEST, 2L);
resultIntent.putExtras(bundle);
ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultIntent);
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);
mSolo.clickOnView(btnMap); //button properly clicked, activity started
Activity currentActivity = mInstr.waitForMonitor(monitor);

如果我理解正确,如果我将“true”传递给 addMonitor(),启动应该被阻止并且我的调用活动应该收到模拟结果。它没有发生。请求的活动正常启动,并且在模拟器中可见。结果不会返回给调用活动。有人有类似的问题吗?

4

2 回答 2

2

Solo 使用一个内部的 ActivityMonitor 来捕获所有的意图,并且只有第一个匹配的监视器被命中,所以你的监视器永远不会被命中,因为它是在 Solo 的 ActivityMonitor 之后创建的。

您可以通过在 Solo 的显示器之前插入显示器来使其工作,如下所示:

ActivityMonitor soloMonitor = mSolo.getActivityMonitor();
mInstr.removeMonitor(soloMonitor);
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);

// Put back Solo's monitor after yours
mInstr.addMonitor(soloMonitor);
于 2013-06-19T14:42:15.800 回答
0

好的,我设法通过手动返回模拟意图来解决这个问题:

Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putLong(ActivityBundleKeys.KEY_TEST, 2L);
resultIntent.putExtras(bundle);
ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultIntent);
//Don't know why, but "result" parameter in below call is not used
ActivityMonitor monitor = mInstr.addMonitor(MapViewActivity.class.getName(), result, true);
mSolo.clickOnView(btnMap); 
Activity currentActivity = mInstr.waitForMonitor(monitor);      
currentActivity.setResult(Activity.RESULT_OK, resultIntent);//manually seting the returned intent
currentActivity.finish();
mInstr.waitForIdleSync();
于 2012-06-27T19:58:36.060 回答