Intent的作用:使你的程序通过Intent调用相应的组件。
Intent(意图)的概念:表示我们要执行的某个操作。例如:查看某联系人的详细资料,发邮件给某人并传送一个文件,打电话给某人说某事。
Intent通过下面的属性来描述以上的某个意图:
1、Action(动作):用来表示意图的动作,如:查看,发邮件,打电话
2、category(类别):用来表示动作的类别。
3、data(数据):表示与动作要操作的数据。如:查看 联系人
4、type(数据类型):对data类型的描述。
5、extras(附件信息):附件信息。如:详细资料,一个文件,某事。
6、component(目标组件):目标组件。
android内置的Intent的各属性见google文档或http://book.51cto.com/art/200908/142683.htm
Intent的生成和各属性设置:见API
工作原理:你的程序向Android发送一个Inent请求,Android会根据Intent的内容在注册的IntentFilter中选择适当的组件来响应。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给Android,Android会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器Activity来浏览网页。
详细过程如下:
1、调用者生成Intent对象,并设置相关属性。生成的Intent分为以下两种:
显示Intent:对于明确指出了目标组件名称的Intent(调用setComponent或setClass来指定)。
隐式Intent:对于没有明确指出目标组件名称的Intent。于隐式Intent,由于没有明确的目标组件名称,所以必须包含足够的属性信息,他们是:Action,Data,Category。再由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。
2、向Android提交Intent请求:
根据要调用的组件不同,请求方式不同:startActivity(Intent),startServer(Intent),sendBroadcast(Intent)。
3、Android对Intnt进行解析,选择相应的组件进行相应。这里可以选择多个组件进行相应。
对于显示Intent,已经明确定义了目标组件的名称,直接调用目标组件响应即可。
对于隐形Intnt,具体的选择方法是:Android将Intent的属性和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
4、注册目标组件,配置IntentFilter。
是目标组件在Android-Manifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。而一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。Action,Data,Category。而Extra和Flag在解析收到Intent时是并不起作用的。
应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。每个IntentFilter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比如之前请求网页浏览器这个例子中,网页浏览器程序的IntentFilter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。
如何为组件声明自己的IntentFilter? 常见的方法是在AndroidManifest.xml文件中用属性<Intent-Filter>描述组件的IntentFilter。
前面我们提到,隐式Intent和IntentFilter进行比较时的三要素是Intent的Action、Data以及Category。实际上,一个隐式Intent请求要能够传递给目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。接下来我们讲解这三方面检查的具体规则。
1.动作测试
<intent-filter>元素中可以包括子元素<action>,比如:
view plaincopy to clipboardprint?
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通
过了这条<intent-filter>的动作测试。
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
2.类别测试
<intent-filter>元素可以包含<category>子元素,比如:
view plaincopy to clipboardprint?
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的IntentFilter仅仅只会匹配没有设置类别的Intent请求。
3.数据测试
数据在<intent-filter>中的描述如下:
view plaincopy to clipboardprint?
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Intent请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
显式Intent直接用组件的名称定义目标组件,这种方式很直接。显式Intent多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。隐式Intent恰恰相反,由于开发人员往往并不清楚别的应用程序的组件名称,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fenghome/archive/2010/07/31/5777855.aspx
分享到:
相关推荐
总结一下Intent概念
主要介绍Intent的常见用法,收发信息,打电话,浏览图片,发送邮件等等
intent总结代码
Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能会出现异常。比如App闪退,或是Intent发送不成功,logcat...
Android IntAndroid Intent的几种用法全面总结ent的几种用法全面Android Intent的几种用法全面总结总结
Intent 与 Intent Filters 实现外部调用
Intents and Intent Filters 三种应用程序基本组件——activity, ... 在上述三种情况下, android系统会自己找到合适的activity, service, 或者 broadcast receivers来响应intent. 三者的intent相互独立互不干扰.
android Intent.FLAG大全
Android 广播大全 Intent Action 事件 Android 广播大全 Intent Action 事件是 Android 系统中的一种核心机制,用于在应用程序之间传递信息和事件通知。 Intent 是一种轻量级的消息对象,用于描述一个操作的请求或...
Intent总结
总结了详细的intent匹配规则,是activity中的重点
intent_action大全
Intent 显示网页、拨打电话、发送SMS/MMS、播放多媒体等等,代码简洁,非常实用。
有关intentdata和type的介绍及相关实例。
IntentIntent-Filter思维导图
关于Action intent的实例,包括自定义的action和系统自带的action。
开发一年多android 对intent 一般用到的地方总结了一下!
explicint intent,即显示意图实例
归纳了Intent入 的4种形式:Intent转换与复制、 Action/Component/Data注 、PendingIntent误用与 parseUri注 入 归纳了利用自动化的工具具发现这4类形式的方法,通过批 量的扫描,可以轻易发现这些漏洞 在每种都找到了...