`
xtfncel
  • 浏览: 74471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android手记之---intent

阅读更多

意图(Intent)

 

    Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

    Intent可以划分成显式意图和隐式意图。

    显式意图:调用Intent.setComponent()Intent.setClass()方法明确指定了组件名的Intent为显式意图(也可以通过intent的构造器来指定),显式意图明确指定了intent应该传递给哪个组件。

    隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。如果某个组件的意图过滤器intent-filter匹配了这个意图,那么会把这个意图传给这个组件来处理.

 

2,意图过滤器的匹配规则

当调用startActivity方法时,会为这个意图自动加上了一个类别:

Category(android.intent.category.DEFAULT)

    关于过滤器中的数据data部分的匹配.系统并不要求过滤器中的data与意图中的data各个部分完全匹配.

 

动作匹配(Action test

一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:

1.如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会匹配失败。没有意图能够通过这个过滤器。

2.另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个匹配.

 

类别匹配

对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。也就是说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,所有该schemeURIs都能够和这个过滤器相匹配;如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。

    总结:过滤器中有的URL的部分intent中也一定要有才能匹配,过滤器中有的部分可以是intent有的URL的子集.

 

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

a.一个既不包含URI也不包含数据类型的意图对象仅在过滤器也同样没有指定任何URIs和数据类型的情况下才能通过测试。

b.一个包含URI但没有数据类型的意图对象仅在它的URI和一个同样没有指定数据类型的过滤器里的URI匹配时才能通过测试。这通常发生在类似于mailto:tel:这样的URIs上:它们并不引用实际数据。

c.一个包含数据类型但不包含URI的意图对象仅在这个过滤器列举了同样的数据类型而且也没有指定一个URI的情况下才能通过测试。

d.一个同时包含URI和数据类型(或者可从URI推断出数据类型)的意图对象可以通过测试,如果它的类型和过滤器中列举的类型相匹配的话。如果它的URI和这个过滤器中的一个URI相匹配或者它有一个内容content:或者文件file: URI而且这个过滤器没有指定一个URI,那么它也能通过测试。换句话说,一个组件被假定为支持content:file: 数据如果它的过滤器仅列举了一个数据类型。

 

***intent.setType("")方法设置数据类型后,会对前面设的数据uri进行清空,所以在intent-filter中不用匹配前面设的uri,如果这时intent-filter中有uri匹配项的话,反而匹配不了了.

 

3,显式/隐式意图的应用场景

显式意图:在项目的内部建义使用显式意图;

隐式意图:在应用与应用之间只能使用隐式意图;

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics