1

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>

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

为什么?根据文档,当我的过滤器没有指定操作时,带有某些操作的意图应该会填充它。

4

2 回答 2

2

请参阅有关 IntentFilters 的文档,尤其是Intent Resolution部分中对动作测试的以下描述:

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

要通过此测试,Intent 对象中指定的操作必须与过滤器中列出的操作之一匹配。如果对象或过滤器没有指定动作,结果如下:

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

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

从中可以清楚地看出,不IntentFilter包含任何动作的 an将不会匹配任何 Intent对象。这就是你所看到的。


另一方面,我完全同意您的观点,即文档不一致。甚至我在此处复制的部分也不一致,因为它声明“过滤器必须包含至少一个元素,否则它将阻止所有意图”以及“未指定操作的 Intent 对象自动通过测试——只要因为过滤器至少包含一项操作。”

于 2013-07-18T13:35:44.643 回答
-1

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

于 2013-07-18T07:23:30.487 回答