android学习笔记——Intent的解析(Intent的隐式调用)

对于显式的Intent,因为已经明确了目标组件,因此不需要系统去解析。由于隐式Intent没有明确的目标组件,因此,当隐式Intent被抛出后,系统在众多组件中根据Intent过滤器中的action、datatype、Uri来寻找预期匹配的处理方法。如果存在多个结果,用户可以根据需要选择合适的处理方法。

一个Intent过滤器是一个IntentFilter类的实例,它包括3个方面:Action、Data(包括Uri和MIME)、Category。Intent过滤去要检测隐式Intent的三个方面(Intent对象的Extra和 Flag在Intent过滤器方面并不发回作用),其中任何一个匹配失败,Android系统都不会传递Intent给该组件。然而,因为一个组件可以有多个Intent过滤器,即使一个Intent不能通过组件的某个过滤器检测,其他过滤器也仍可以通过检测。

1.Action过滤规则
虽然一个Intent对象仅包含一个动作,但是一个Intent过滤器可以列出不止一个动作。 一个Intent过滤器必须至少包含一个子元素,否则它将阻塞所有的Intent。
对Action的过滤原则是:Intent对象中指定的动作必须匹配Intent过滤器动作列表中的一个。如果Intent或Intent过滤器没有指定一个动作,则:如果Intent过滤器没有指定动作,没有一个Intent被匹配,所有的Intent都检测失败,即没有Intent能通过Intent过滤器;如果Intent对象没有指定动作(但必须指定其他属性),将自动通过检查(前提是Intent过滤器的动作列表不为空)


2.Category过滤规则
对类别的过滤原则是:Intent对象中的每个类别必须匹配Intent过滤器中的一个。即Intent过滤器能够列出额外的类别,但是Intent对象中的类别都必须能够在Intent过滤器中找到,只要有一个类别在Intent过滤器列表中没有,就算类别检测失败。因此,原则上如果一个Intent对象中没有类别(即类别为空字段),那么应该总是通过类别测试,而不管Intent过滤器中有什么类别。但是有一个例外,android对待所有传递给Context.startActiviy()的隐式Intent至少包含“android.intent.category.DEFAULT”类别。


3.Data过滤规则
当匹配一个Intent到一个能够处理数据的组件时,通常需要知道数据的类型和它的Uri。在许多情况下,数据类型能够从Uri中推测。每个元素指定一个Uri和数据类型。
Uri有scheme、 host、port、path 四个属性,有关Uri的详细介绍可以上网查查看。
对数据的过滤原则是:数据检测既要检测Uri,也要检测数据类型。规则如下:
  1. 一个Intent对象既不包含Uri,也不包含数据类型:仅当Intent过滤器也不指定任何Uri和数据类型时,才能通过检测,否则不能通过。
  2. 一个Intent对象包含Uri,但不包含数据类型:仅当Intent过滤器也不指定数据类型,同时它们的Uri匹配,才能通过检测。例如:mailto:和tel: 都不指定实际数据。
  3. 一个Intent对象包含数据类型,但不包含Uri:仅当过滤也只包含数据类型,且与Intent相同时,才能通过检测。
  4. 一个Intent对象既包含Uri,也包含数据类型(或数据类型能够从Uri推断):数据类型部分,只有与Intent过滤器中质疑匹配才算通过;Uri部分,它的Uri要出现在Intent过滤器中,或者它有content:或file:Uri,又或者Intent过滤器没有指定Uri。
说明:当比较Intent对象和Intent过滤器的Uri 时,仅仅比较Intent过滤器中出现的Uri属性。例如,如果一个Intent过滤器仅指定了scheme和authority,但没有指定path,所有匹配scheme和authority的Uri都通过检测,而不管他们的path是否匹配;如果四个属性都指定了,则要都匹配才能算是匹配。然而,Intent过滤器中的path可以包含通配符来匹配path中的一部分。 


4.通用匹配
元素的type属性指定数据的MIME类型。Intent对象和Intent过滤器都可以用“*”通配符子类型字段,例如“text/*”,“audio/*”表示任何子类型。
通常,组件能够从文件或ContentProvider获取本地数据。因此,它们的Intent过滤器仅列出数据类型且不必明确指出content: 和file: scheme的名字。只是一种典型的情况。如一个元素描述如下:
     
这表明组件能够从ContentProvider获取image 数据并显示它。
因为大部分可用数据由ContentProvider分发,因此,Intent过滤器指定一个数据类型但不指定Uri是一种非常通用的做法。

你可能感兴趣的:(android学习笔记)