阅读《Android 从入门到精通》(34)——Intent Filter

Intent Filter 作用

用于传递期望动作、共享数据、指定动作执行的组件类别,以及其他有关指令,必要时会找寻或启动 Intent Filter 指定的组件来响应这个 Intent。

Intent 组成成分


动作过滤

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:
如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试。

类别过滤

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。
原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的。但有一个例外,Android 把所有传给 startActivity() 的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT 常量)。 因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"。(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外)

数据过滤

当一个意图对象中的 URI 被用来和一个过滤器中的 URI 比较时,比较的是 URI 的各个组成部分。例如,如果过滤器仅指定了一个 scheme,所有该 scheme 的 URIs 都能够和这个过滤器相匹配;如果过滤器指定了一个 scheme、主机名但没有路经部分,所有具有相同 scheme 和主机名的 URIs 都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个 scheme、主机名和路经,只有具有相同 scheme、主机名和路经的 URIs 才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

数据测试同时比较意图对象和过滤器中指定的 URI 和数据类型。规则如下:

(1)一个既不包含 URI 也不包含数据类型的意图对象仅在过滤器也同样没有指定任何 URIs 和数据类型的情况下才能通过测试。
(2)一个包含 URI 但没有数据类型的意图对象仅在它的 URI 和一个同样没有指定数据类型的过滤器里的 URI 匹配时才能通过测试。这通常发生在类似于 mailto 和 tel——这样的 URIs 上,它们并不引用实际数据。
(3)一个包含数据类型但不包含 URI 的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个 URI 的情况下才能通过测试。
(4)一个同时包含 URI 和数据类型(或者可从 URI 推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的 URI 和这个过滤器中的一个 URI 相匹配或者它有一个内容 content: 或者文件 file:URI 而且这个过滤器没有指定一个 URI,那么它也能通过测试。换句话说,一个组件被假定为支持 content: 和 file: 数据如果它的过滤器仅列举了一个数据类型。

其他过滤

如果一个 Intent 可以通过不止一个活动或服务的过滤器,那么用户会被询问那个组件被激活,没找到目标则会产生异常。
上述内容表明组件可以从文件或者内容提供者获取本地数据。因此,他们的过滤器仅列出数据类型而不必明确指出 content: 和 file:scheme 的名字。
指定数据类型不指定 URL 最通用,也可以指定 scheme 和数据类型。

Intent Filter 类方法


阅读《Android 从入门到精通》(34)——Intent Filter_第1张图片


你可能感兴趣的:(android)