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>
我再次发出同样的意图。现在我的活动没有开始。
为什么呢?根据文档,当我的过滤器没有指定任何动作时,使用某些动作的意图应该满足它。
答案 0 :(得分:1)
请参阅<{>>意图解析部分中的documentation on IntentFilters,尤其是操作测试的以下说明:
如示例所示,Intent对象仅命名一个 动作,过滤器可能会列出多个。列表不能为空;一个 filter必须至少包含一个元素,否则它将被阻塞 所有意图。
要通过此测试,必须在Intent对象中指定的操作 匹配过滤器中列出的其中一个操作。如果对象还是 filter没有指定动作,结果如下:
如果过滤器未能列出任何操作,则没有任何意图匹配,因此所有意图都无法通过测试。没有意图可以获得 通过过滤器。
另一方面,未指定操作的Intent对象会自动通过测试 - 只要过滤器包含at 至少一个动作。
很明显,包含无操作的IntentFilter
与任何 Intent
对象不匹配。这就是你所看到的。
另一方面,我绝对同意你文档不一致。甚至我在这里复制的部分也是不一致的,因为它声明了“一个过滤器必须包含至少一个元素,否则它将阻止所有意图”以及“一个没有的Intent对象指定操作会自动通过测试 - 只要过滤器包含至少一个操作。“
答案 1 :(得分:-1)
您还应在来源中对i.setAction("ma");
发表评论。