33

我想创建一个 Intent-Filter,以便某些链接将触发我的应用程序的启动(例如,请参阅此 stackoverflow-thread:如何注册一些 URL 命名空间 (myapp://app.start/) 以访问您的程序通过在 Android 操作系统的浏览器中调用 URL?

在尝试时,我发现我不太了解 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但我仍然缺少基本的理解。

4

2 回答 2

90

与其从你的应用程序的角度来看它,不如把它翻转过来,从 Intent 端看它。

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

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

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

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

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

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

于 2011-04-01T16:19:00.743 回答
2

我不得不检查代码android.content.IntentFilter.matchCategories(Set<String> categories)以了解类别的匹配:

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

特别是#1和#3并不明显。

于 2014-11-27T15:36:31.623 回答