【问题标题】:intent filter without action没有动作的意图过滤器
【发布时间】:2013-07-17 14:06:47
【问题描述】:

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>

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

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

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    请参阅documentation on IntentFilters,尤其是意图解析部分中对动作测试的以下描述:

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

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

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

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

    很明显,包含 no actionsIntentFilter 不会匹配 any Intent 对象。你看到的是什么。


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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        相关资源
        最近更新 更多