Intent:
在Android系统中,Intent是非常重要的一个概念,它是启动activity、service、broadcast这三大组件关键信息。那什么是Intent呢?SDK doc中是这样定义的:
引用
An Intent object is a bundle of information. It contains information of interest to the component that receives the intent (such as the action to be taken and the data to act on) plus information of interest to the Android system (such as the category of component that should handle the intent and instructions on how to launch a target activity)
.Intent是一些信息的集合,包括了目标组件感兴趣的信息和一些Android系统自身感兴趣的信息。
Intent主要包括如下几部分信息:
1.ComponentName(要处理本Intent的组件信息):
此部分是一个ComponentName对象,由一个完整类名和在manifest文件中设定的包名组成(完整类名的包部分和manifest中的包名不要求必须一致)。这个部分是可选的,如果设定了Intent的ComponentName,那么这个Intent将直接发送给对应的组件,如果没有设定,Android还有其他的方式来查找合适的组件处理此Intent。
2.Action:
由一个字符串表示的想要进行的活动(广播发出的Intent中的action代表的是已发生的活动)。
3.Data:
此部分是数据部分,包括数据的URI和MIME类型。
4.Category:
关于能处理本Intent的组件的其他信息的一个字符串。每个Intent可以有任意多个Category。
5.Extras:
键-值对表示的其他数据。
6.Flags:
指示Android系统如何启动或启动后如何处理activity的标志信息。
那么,系统是如何将Intent正确的投放个相应的组件的呢?
有如下两种方式:
1.确定的intent:Intent中设置了component name,系统会直接找到对应的组件类并将intent投放给它处理。常用于同一个程序内部,此方式优先级比2高。
2.不确定的intent:在intent中设置action、data、category中的一个或多个,系统根据系统中定组件的intent filter来决定如何投放intent。
Intent中其他信息与系统如何投放intent无关。
Intent filter:
Intent filter是activity 、service、broadcast receiver向Android系统通告自己会处理哪些不确定intent的方式(确定的intent会直接被投放到对应的组件,而不管其是否指定了自己的intent filter),只有能够通过这些filter过滤的intent才会被它们接收到。
一个组件可以有多个intent filter,每个filter向用户展示了此组件的一项能力。每一个filter都会比较action、 data 、category,只有这三项都通过,intent才算通过此filter的过滤而被投放到定义这个filter的组件。由于每个组件可能定义多个filter,一个intent可能通不过这个filter但是通过了另一个filter,所以还是可能会被投放到对应的组件的。
1.action过滤:
一个intent只能指定一个action,但是intent filter可以指定多个action。
如果filter不指定action,那么所有的intent都不会通过这个filter。
2.category过滤:
intent和intent filter都可以有多个category项,只有intent中的category都在filter中时,此intent才算通过过滤,即intent的category必须为filter的category的子集。因此,
如果intent中没有category,那它总是能通过category过滤的。
但是有一种情况除外:对应startActivity()中的不确定的intent,Android系统总是认为这个intent是包含android.intent.category.DEFAULT这个分类的。如果activity想接收一个不确定的intent,那它必须在自己的intent filter中定义android.intent.category.DEFAULT这个category。
3.data过滤:
intent filter中也可以包含多个data项,过滤规则如下:
a.如果一个intent既没包含URI有没包含data type,那么只有filter也没包含两者时,才能通过过滤。
b.如果一个intent包含了URI但没有包含data type,并且data type不能通过URI推断出来时,只有这个URI符合filter的URI并且filter没有指定data type时才能通过过滤。
c.如果一个intent包含了data type但没有包含URI,只有filter也包含对应的data type且也没指定URI时才能通过过滤。
d.如果一个intent包含了URI和data type(或能够通过URI推断出data type),那么,如果data type符合filter时,会通过data type的过滤,要想通过整个data过滤,还必须通过URI部分的过滤:如果URI部分和filter的匹配,或者URI是content:或file:形式且filter中没有定义URI部分。
当inetnt通过了action、category、data过滤后才算通过了这个filter的过滤。
一些常用的配置:
从上面的d可以看出,Android期望一个组件可以接收content provider或本地文件的数据,只要它的filter列出data type而不需要列出content:和file:的URI。因此一种常用的配置方式就是filter类似于:<data android:mimeType="image/*" />
举个例子,当用户点击一个链接时:
1.浏览器软件会首先尝试直接显示链接的内容。
2.如果链接的内容不适于在网页上直接展示,那么它会把链接的scheme和data type等组成一个intent,由系统选择如何打开这些内容
3.如果没有其他的组件能打开,那么会调用download manager下载这些内容。
通过这种机制,信息将会有很多可能的组件来处理。
另外,如果一个程序想不接受任何附加的数据,完全自己来初始化自己,那么可以在intent filter中指定一个android.intent.action.MAIN的action。
分享到:
相关推荐
Android Intents and Intent Filters(一) 对应博客地址:http://blog.csdn.net/michael__li/article/details/6947545
Android Intents and Intent Filters(二)源代码 对应博客 http://blog.csdn.net/michael__li/article/details/6950127
内含四个pdf文件,分别为 Intent and Intent-filter Intents and Intent Filters理论英文 Intents and Intent Filters理论中文 Intent入门指南 详尽介绍关于android intent
总之,Intent和Intent Filters是Android系统的核心组成部分,它们使得不同应用间的交互变得简单而灵活。通过正确配置Intent Filter,开发者可以让自己的应用能够响应特定的Intent,从而实现各种功能,如拨打电话、...
意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52 系统...
意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52 系统偏好:...
Creating Intent Filters and Broadcast Receivers Chapter 6: Using Internet Resources Downloading and Parsing Internet Resources Using the Download Manager Using Internet Services Connecting to Google ...
Intents, Intent Filters Broadcasts and Broadcast Receivers Tutorial #15 - Sharing Your Notes Services and the Command Pattern Tutorial #16 - Updating the Book Large-Screen Strategies and Tactics ...
Intents, Intent Filters Broadcasts and Broadcast Receivers Tutorial #15 - Sharing Your Notes Services and the Command Pattern Tutorial #16 - Updating the Book Tutorial #17 - Supporting Large Screens ...
**Intent和Intent过滤器(Intents and Intent Filters)** Intent是一种在Android组件之间进行交互的机制,可以启动一个活动、服务或者传递广播。Intent过滤器是用于指定一个组件能够响应哪一种Intent的声明,位于...
5. 意图和意图过滤器(Intents and Intent Filters) 意图过滤器用于声明组件愿意接收哪些Intent。通常情况下,一个组件能够接收的Intent类型是由其声明的意图过滤器来决定的。 - 使用意图匹配(Using Intent ...
6. **Intents and Intent Filters**:Intent是Android中组件间通信的机制。`SearchableDictionary`会设置Intent Filter,使得系统知道何时该启动此应用来处理特定类型的搜索请求。 7. **异步处理和性能优化**:为了...
2. **Intents and Intent Filters**:详细介绍了Intent的工作原理以及如何使用Intent Filters来过滤和匹配Intent。 3. **Activities**:专门讲解了Activity组件的使用方法,包括生命周期管理等内容。 #### 五、总结...
8. **Intents and Intent Filters**:Android应用间的通信机制,允许启动活动、发送广播和处理数据共享。 9. **Notifications**:Android的通知系统,用于向用户展示应用的重要信息。 10. **Services**:后台运行...
2. Intent与Intent过滤器(Intents and Intent Filters): - Intent是一种消息传递机制,用于组件之间的通信。它允许开发者启动一个新的Activity,传递数据给Service,或者发送广播。 - Intent过滤器用于声明组件...