【问题标题】:ActivityMonitor getHits() doesn't workActivityMonitor getHits() 不起作用
【发布时间】:2012-11-26 14:33:01
【问题描述】:

我试过这个测试,但 getHits() 总是返回 0。任何人都可以帮助我吗?

 public void testSettingsAboutShazamClickOnLink() {

    Instrumentation inst = getInstrumentation();
    IntentFilter intentFilter = new IntentFilter(android.content.Intent.ACTION_SENDTO);
    intentFilter.addDataScheme("mailto");


    ActivityMonitor monitor = inst.addMonitor(intentFilter, null, false);
    final Intent emailIntent = new Intent(android.content.Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:"));
    emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


    assertEquals(0, monitor.getHits());
    inst.getContext().startActivity(emailIntent);        
    monitor.waitForActivityWithTimeout(5000);
    assertEquals(1, monitor.getHits());
    inst.removeMonitor(monitor);
 }

【问题讨论】:

  • 目标是在这种情况下调用另一个程序 gmail 来发送电子邮件,因此没有真正要调用的活动,我从 inst.getContext().startActivity(emailIntent); 开始意图;测试工作正常,并且可以编写新电子邮件,但 getHits() 始终返回 0

标签: java android


【解决方案1】:

我解决了这个问题。我使用了Robotium的Solo,显然Solo插入了一个匹配每个Filter的ActivityMonitor,所以当你调用startActivity时,它会调用Instrumentation类中的execStartActivity,其代码是

 Context who, IBinder contextThread, IBinder token, Activity target,
    Intent intent, int requestCode) {
    IApplicationThread whoThread = (IApplicationThread) contextThread;
    if (mActivityMonitors != null) {
        synchronized (mSync) {
            final int N = mActivityMonitors.size();
            for (int i=0; i<N; i++) {
                final ActivityMonitor am = mActivityMonitors.get(i);
               if (am.match(who, null, intent)) {
                   am.mHits++;
                    if (am.isBlocking()) {
                        return requestCode >= 0 ? am.getResult() : null;
                    }
                   break;
                }
            }
       }
    }

一旦有一个 ActivityMonitor 与某项匹配,该监视器的 mHits 就会增加,“循环”就会中断。鉴于调用 Solo 是我做的第一件事,第一个要检查的 ActivityMonitor 是 Solo 的,因为它匹配所有内容,在未检查之后添加的任何其他 ActivityMonitors,因此不会为其他监视器增加 mHits 变量。如果你想了解更多,请看 Instrumentation 类的 execStartMonitor 方法,记住这个方法是在 startActivity 调用之后调用的。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Instrumentation.java#Instrumentation.execStartActivity%28android.content.Context%2Candroid.os.IBinder%2Candroid.os.IBinder%2Candroid.app.Activity%2Candroid.content.Intent%2Cint%29

【讨论】:

  • 那么答案是什么?
猜你喜欢
  • 2014-05-09
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多