意图过滤器没有动作

时间:2013-07-17 14:06:47

标签: android android-intent

Android的文档说:

http://developer.android.com/reference/android/content/IntentFilter.html

“如果任何给定值与Intent操作匹配,或者在过滤器中未指定任何操作,则操作匹配。”

我只是试着测试一下。在我的测试应用程序中,我为其中一项活动设置了这样的过滤器:

<intent-filter>
    <action android:name="ma" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="mk1" />
</intent-filter>

我尝试发送这样的意图:

Intent i = new Intent();
i.setAction("ma");
i.addCategory("mk1");
startActivity(i);

它有效 - 我的活动开始了。

然后我在过滤器中注释掉操作:

<intent-filter>
    <!-- <action android:name="ma" /> -->
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="mk1" />
</intent-filter>

我再次发出同样的意图。现在我的活动没有开始。

为什么呢?根据文档,当我的过滤器没有指定任何动作时,使用某些动作的意图应该满足它。

2 个答案:

答案 0 :(得分:1)

请参阅<{>>意图解析部分中的documentation on IntentFilters,尤其是操作测试的以下说明:

  

如示例所示,Intent对象仅命名一个   动作,过滤器可能会列出多个。列表不能为空;一个   filter必须至少包含一个元素,否则它将被阻塞   所有意图。

     

要通过此测试,必须在Intent对象中指定的操作   匹配过滤器中列出的其中一个操作。如果对象还是   filter没有指定动作,结果如下:

     
      
  • 如果过滤器未能列出任何操作,则没有任何意图匹配,因此所有意图都无法通过测试。没有意图可以获得   通过过滤器。

  •   
  • 另一方面,未指定操作的Intent对象会自动通过测试 - 只要过滤器包含at   至少一个动作。

  •   

很明显,包含无操作IntentFilter任何 Intent对象不匹配。这就是你所看到的。


另一方面,我绝对同意你文档不一致。甚至我在这里复制的部分也是不一致的,因为它声明了“一个过滤器必须包含至少一个元素,否则它将阻止所有意图”以及“一个没有的Intent对象指定操作会自动通过测试 - 只要过滤器包含至少一个操作。“

答案 1 :(得分:-1)

您还应在来源中对i.setAction("ma");发表评论。