Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:Activity(活动)、Server(服务)和Broadcast Receiver(广播接收器)。
Intent对象可以封装六种信息:
组件名(Component name)
动作(Action)
种类(Category)
数据(Data)
附加信息(Extra)
标志(Flags)
【1】Intent可以划分成显式意图和隐式意图。
显式意图:
Intent intent=new Intent();
intent = new Intent(this,MyActivity.class);
调用Intent.setComponent()或Intent.setClass()或setClassName()方法明确指定了组件名的Intent为显式意图。显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:
Intent intent=new Intent();
intent.setAction("android.intent.action.MYACTION1");
Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和MIME Type——要访问的组件处理的数据类型)找到最合适的组件来处理这个意图。
【2】对于隐式意图,Android是怎样寻找到这个最合适的组件呢?
<activity
android:name="mobile.android.filter.producer.FilterProducerActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MYACTION1" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="*"
android:mimeType="audio/*"
android:path="/work/upload.jsp"
android:port="8080"
android:scheme="http" />
</intent-filter>
</activity>
记的前面我们在定义Activity时,指定了一个intent-filter,Intent Filter(意图过滤器)其实就是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,只有三个方面会被参考到:动作、数据(URI以及MIME Type数据类型)和类别。
动作测试(Action test)
一个意图对象只能指定一个动作名称,而一个过滤器可能列举多个动作名称。如果意图对象或过滤器没有指定任何动作,结果将如下:? 如果过滤器没有指定任何动作,那么将阻塞所有的意图,因此所有的意图都会测试失败。没有意图能够通过这个过滤器。
? 另一方面,只要过滤器包含至少一个动作,一个没有指定动作的意图对象自动通过这个测试
类别测试(Category test)
对于一个能够通过类别匹配测试的意图,意图对象中的类别必须匹配过滤器中的类别。这个过滤器可以列举另外的类别,但它不能遗漏在这个意图中的任何类别。原则上一个没有类别的意图对象应该总能够通过匹配测试,而不管过滤器里有什么。大部分情况下这个是对的, 但有一个例外。
Android把所有传给startActivity()的隐式意图当作他们包含至少一个类别:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。
因此,想要接收隐式意图的活动必须在它们的意图过滤器中包含"android.intent.category.DEFAULT"
(带"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器是例外而且这两个必须同时具备,成对出现)
数据测试(Data test)
当一个意图对象中的URI被用来和一个过滤器中的URI比较时,比较的是URI的各个组成部分。例如,如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。数据测试同时比较意图对象和过滤器中指定的URI和数据类型。