【问题标题】:Android: Understanding Intent-FiltersAndroid:了解意图过滤器
【发布时间】:2011-07-27 18:43:39
【问题描述】:

我想创建一个 Intent-Filter,以便某些链接将触发我的应用程序的启动(请参阅此 stackoverflow-thread 例如:How to register some URL namespace (myapp://app.start/) for accessing your program by calling a URL in browser in Android OS?

在尝试时,我发现我不太了解 Intent 和 Intent-Filters(在 Manifest.xml 中定义)实际上是如何工作的。以下有什么区别:

<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />

或以下:

<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MAIN" />

类别和动作意图过滤器之间的区别实际上是什么。我阅读了此页面http://developer.android.com/reference/android/content/Intent.html,但我仍然缺少基本的了解。

【问题讨论】:

    标签: android android-intent intentfilter


    【解决方案1】:

    我不得不检查android.content.IntentFilter.matchCategories(Set&lt;String&gt; categories)的代码来理解类别的匹配:

    1. 成功匹配,如果您的 IntentFilter 有类别并且 Intent 不提供类别
    2. 如果您的 IntentFilter 具有 Intent 的所有类别,则匹配成功。过滤器还可以有其他类别。
    3. 不匹配,如果您的 IntentFilter 没有类别而 Intent 有类别
    4. 不匹配,如果您的 IntentFilter 没有 Intent 拥有的类别

    尤其是#1 和#3 并不明显。

    【讨论】:

    • 那么,如果我有类别 a、b 和意图过滤器 a、b、c 的意图,那么过滤器会捕获意图吗?
    • 完全正确。 反过来是不必要的——intent 过滤器可以声明比 Intent 中指定的更多的类别,而 Intent 仍然会通过。 developer.android.com/guide/components/…
    【解决方案2】:

    不要从应用的角度看它,而是翻转它并从 Intent 端看它。

    创建 Intent 时,创建者不知道系统上有哪些应用程序来处理该 Intent。但是创建者确实知道它想要做什么(例如,一个应用程序可能想让用户从设备上的某个位置选择一个联系人),并且需要联系系统上的其他应用程序以询问他们想要什么。

    为此,Intent 附加了几条信息。其中包括动作和类别。

    动作以一般方式定义 Intent 想要执行的动作,例如查看联系人、从图库中选择图像等。

    类别是一条额外的信息,它为 Intent 提供了另一种区分自身的方式。例如,当点击浏览器中的链接时,创建的 Intent 会附加 BROWSABLE 类别。

    因此,当操作系统解析 Intent 时,它会查找已注册的具有包含所有信息片段的意图过滤器的活动或广播接收器。如果 Intent 指定了 PICK 动作,那么没有带有 PICK 动作的意图过滤器的活动将从处理该 Intent 的候选列表中丢弃。

    通过这种方式,与 Intent 关联的操作、类别、类型和(可能)方案的组合集用于确定可以处理 Intent 的活动集。当您在清单中设置意图过滤器时,您是在告诉操作系统您可以处理哪类意图。

    【讨论】:

    • 知道了,就是我要找的
    • 我可以说,如果我们想支持来自应用程序外部的操作/请求,我们可以设置 Intent-filter 吗?
    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多