From:http://www.eoeandroid.com/thread-78484-1-1.html
<wbr></wbr>
Activity、Service和Broadcast Receiver这些核心组件之间通过消息激活,这个消息就是Intent。
<wbr><wbr><wbr><wbr>Intent消息可用于当前运行时同应用内部的组件之间或者不同应用的组件之间通信。Intent自身,即一个Intent对象,包含说明一个执行 操作的抽象数据结构,传递给执行操作的组件,或者,常见于broadcast的情况,该数据结构用于描述正在执行或者已经发生的事情。<br><br><wbr><wbr><wbr><wbr>针对组件类型不同,发送Intent有不同的机制:<br><wbr><wbr><wbr><wbr>针对Activity,Context.startActivity()方法传递Intent,启动一个新的Activity,或者 Activity.startActivityForResult()方法启动新的Activity做完事情后返回到本Activity来;<br><wbr><wbr><wbr><wbr>针对Service,Context.startService()方法,用于创建一个Service或者传递给已经运行Service一个指 令,于此类似,Context.bindService()建立当前组件和Service之间的连接,可选的,如果该Service未运行,可以创建新的实例;<br><wbr><wbr><wbr><wbr>针对Broadcast Receiver,可通过:Context.sendBroadcast()、Context.sendOrderedBroadcast()或者 Context.sendStickyBroadcast()方法发送Intent给所有感兴趣的broadcast receiver。<br>
在以上各种情况下,Android系统找到适合响应该Intent的activity、service或者broadcast service集合。不会出现重叠现象,即,broadcast intent只会发送给broadcast receiver,而不会发送给Activity或者Service。<br><br><wbr><wbr><wbr><wbr><strong>Intent对象<br></strong><wbr><wbr><wbr><wbr>Intent对象可绑定一组信息:<br><wbr><wbr><wbr><wbr>接收intent的组件需要的信息,比如需要调用系统照相机Activity,要告知它照片存放的路径;<br><wbr><wbr><wbr><wbr>Android系统需要的信息,比如那个种类的组件可以处理这个Intent,在比如,告知如何启动Activity(比如要求它在哪个task中)。<br><br><wbr><wbr><wbr><wbr>Intent对象主要包含以下内容:<br><wbr><wbr><wbr><wbr>componnet name,组件名称,可处理这个Intent的组件名称。组件名称是可选的,如果填写,Intent对象会发送给指定组件名称的组件,否则,也可以通过其他Intent信息定位到适合的组件。组件名称是个ComponentName类型的对象,该对象又包括:<br><br><wbr><wbr><wbr><wbr>目标组件完整的类名,比如:com.example.project.app.FreneticActivity;<br><wbr><wbr><wbr><wbr>在manifest文件中设置的包名,组件的包名和manifest中定义的包名可以不匹配。<br><wbr><wbr><wbr><wbr>action,命名动作的字符串,用于执行动作,或者,在广播的情况下,表示发生的或者要报告的动作。 Intent类定义了一组action常量,见API的Intent.ACTION_*。这些是Intent类预制的一些通用action,还有一些 action定义在android其他API中。用户可以定义自己的action字符串常量,用于激活自己的应用组件。这需要把应用的包名作为该字串的前 缀,比如:com.example.project.SHOW_COLOR。action名称很像java调用的方法名,下面提到的data和extra
类似参数和返回值。<br><br><wbr><wbr><wbr><wbr>data,起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的。比 如,action是ACTION_EDIT,那么data要包含要编辑的文档URI。如果action是ACTION_CALL,data可能是tel: 前缀后面跟电话号码,在比如action是ACTION_VIEW,data是http:开头的URI,则应该是显示或者下载该uri的内容。在匹配 intent到能处理该组件的过程中,data(MIME类型)类型是很重要的。比如,一个组件是可以显示图片数据的而不能播放声音文件。很多情况
下,data类型可在URI中找到,比如content:开头的URI,表明数据在设备上,而且有content provider控制。但是有些类型只能显式的设置。setData()方法只能设置data的uri,setType()可设置MIME类 型,setDataAndType()即可设置URI也可设置MIME类型。<br><br><wbr><wbr><wbr><wbr>category,包含处理intent组件种类的额外信息。对一个Intent可以设置任意多个category描述,和cation类似,Intent类预制了一些category常量,Intent.CATEGORY_*。<br><br><wbr><wbr><wbr><wbr>extras,可以看作一个Map,通过键值对,可为处理Intent组件提供一些附加的信息。可通过put..()和get..()存取信息。也可以获取Bundle对象,然后通过putExtras()和getExtras()方法存取。<br><br><wbr><wbr><wbr><wbr>flug,用于多种情况,在intent增加flug,比如可以指示Android如何启动一个activity,比如是否属于或者不属于当前task,以及,处理完毕后activity的归属。这些flag都定义在Intent类的常量中。<br><br><wbr><wbr><wbr><wbr><strong>Intent解析</strong><br><wbr><wbr><wbr><wbr>intent的投递,有两种方式:<br><wbr><wbr><wbr><wbr>显式的设定目标组件的component名称。不过有时开发者不知道其他应用的component名称。显式方式常用于自己应用内部的消息传递,比如应用中一个activity启动一个相关的service或者启动一个姊妹activity;<br>
隐式intent,component名称为空的情况。这种方式往往用于激活其他应用中的组件。<br><br><wbr><wbr><wbr><wbr>android投递一个显式的intent,只需找到对应名称的组件即可。<br><wbr><wbr><wbr><wbr>隐式的intent需要用到不同的策略。android需要找到处理这个intent的最合适组件(集合)。要通过intent filter,比较intent对象和组件关联结构。filter根据组件的能力决定他们能处理哪些intent。android系统打开合适的组件处理 相应的隐式intent。如果组件不包含任何intent filter,那只能接收显式的intent。带filter的组件既可接收隐式intent也可接收显式的。<br><br><wbr><wbr><wbr><wbr>Intent有三个方面可用于intent filter:<br><wbr><wbr><wbr><wbr>action<br><wbr><wbr><wbr><wbr>data,包括URI部分和数据类型部分<br><wbr><wbr><wbr><wbr>category<br><wbr><wbr><wbr><wbr>extra和flag在这方面不起作用。<br><wbr><wbr><wbr><wbr>Intent filter<br><wbr><wbr><wbr><wbr>为了能支持隐式intent,activity、service和broadcast receiver会包含1到多个intent filter。每个intent filter描述组件的可接收一组intent的能力。在intent filter中,说明了可接受的类型,以及不想要的intent。隐式的intent要想投递到一个组件,只需通过组件的一个filter即可。<br><br><wbr><wbr><wbr><wbr>组件把filter分成多个,是为了针对具体不同的任务。在sample中的Note pad示例中,NoteEditor activity有两个filter,一个用于启动并打开指定的note,另一个是为了打开新的空的note。<br><br><wbr><wbr><wbr><wbr>一个intent filter是一个IntentFilter类的实例。但是,android系统必须在组件未启动的情况下就知道它的能力,因此intent filter一般不会在java代码中设置,而是在应用的manifest文件中作为元素的方式声明。一个例外是,为broadcast receiver注册动态的filter,可以调用Context.registerReceiver()方法,通过直接实例化IntentFilter 对象创建。<br><br><wbr><wbr><wbr><wbr>filter有三个平等的部分:action、data和category。隐式intent将测试这三个部分。一个intent要想投递到一个组件,那么这三个测试都要通过才行。当然如果组件有多个intent filter,可能一个intent没有通过,但是通过了另外的一个,这样也可以把intent投递到组件。<br><br><wbr><wbr><wbr><wbr>action测试<br><wbr><wbr><wbr><wbr>在intent filter中可以包含多个action,比如:<br><br><strong>java代码:</strong><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
-
<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>
<wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)">要想通过测试,intent中的action名称要匹配其中之一。</span><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)">如果intent
filter中不包含action列表,而intent指定action,那么intent没有匹配的action,不通过;intent未指定action,而intent filter指定,会自动通过测试。</span><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)">category测试</span><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"></span><wbr style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><span style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)">在intent
filter中可包含category列表:</span><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><strong>java代码:</strong><br style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)"><div style="color:rgb(73,73,73); font-family:simsun; font-size:14px; line-height:21px; text-align:left; background-color:rgb(234,236,249)">
<div>
<ol style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:none; list-style-position:initial">
<li style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:30px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:decimal; list-style-position:initial">
<intent-filter><br>
</li>
<li style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:30px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:decimal; list-style-position:initial">
<category android:name="android.intent.category.DEFAULT" /><br>
</li>
<li style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:30px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:decimal; list-style-position:initial">
<category android:name="android.intent.category.BROWSABLE" /><br>
</li>
<li style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:30px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; list-style-type:decimal; list-style-position:initial">
</intent-filter></li>
</ol>
</div>
</div>
<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
相关推荐
Android-Intent详解.doc
### Android Intent详解 #### 一、Intent的作用与概念 **Intent** 在Android开发中扮演着极为重要的角色,它是实现Android应用程序内部以及不同应用程序之间通信的关键工具。简而言之,Intent可以被视为一种消息...
### Android Intent 详解 #### 一、Intent 的作用 `Intent` 在 Android 开发中扮演着极其重要的角色,它是用于启动或与应用组件(如 Activity、Service 或 BroadcastReceiver)交互的一种方式。简而言之,`Intent`...
Intent在Android开发中扮演着至关重要的角色,它是四大组件(Activity、Service、BroadcastReceiver和ContentProvider)间通信的关键。Intent不仅用于应用间的交互,也可以在同一个应用内的不同组件之间传递信息。...
标题与描述均指向了“Android各组件详解——Intent”,这一主题深入探讨了Android开发中至关重要的Intent组件。本文将从多个角度解析Intent的功能、应用场景及其内部结构,为开发者提供全面的理解。 ### Intent概述...
### ZX-Android-Intent详解 #### 一、Intent的基本概念及作用 在Android开发中,`Intent`扮演着至关重要的角色。它是一个用于描述要执行的动作的抽象对象,主要用于协助完成Android应用程序内部不同组件间的通信。...
### Android Intent 机制详解 #### 一、Intent 的基本概念 **Intent** 是 Android 四大应用组件(Activity、Service、Broadcast Receiver 和 Content Provider)之间通信的重要桥梁。它是一种消息对象,用来描述一...
在sendBroadcast,startActivity时,我们会用到Intent。 Intent可以携带一些数据,比如基本类型数据int、Boolean,或是String,或是序列化对象,Parcelable与Serializable。 Intent传递数据时,如果数据太大,可能...
在Android应用开发中,Intent是一种强大的机制,它用于在组件之间传递消息,是应用程序中不同组件(如Activity、Service、BroadcastReceiver)之间交互的核心工具。Intent不仅能够启动其他组件,还可以用于在组件间...
Android Intent 详解 Android Intent 是 Android 应用程序中的一种机制,用于在应用程序组件之间进行通讯和交互。 Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此 Intent ...
Android Intent和Intent_Filter详解 Android Intent是 Android 组件间通信的载体,它们之间的通信是通过 Intent 对象在不断传递实现的。Android 的三大核心组件 Activity、Service 和 BroadcastReceiver 都是通过 ...
Android-Intent使用方法详解 配合(http://blog.csdn.net/daiyibo123/article/details/51227160)博客查看。使用Android stdio编写。
android Activity& android Intent详解, 入门级别
**Android Intent机制详解** Intent是Android系统中一个至关重要的组件,它是应用程序间以及应用程序内部组件(如Activity和服务Service)通信的主要桥梁。Intent不仅用于不同应用之间的交互,还用于在同一应用内的...
### Android利用Intent实现分享功能详解 #### 概述 随着移动互联网的发展,用户越来越依赖于在不同的应用程序之间共享内容。为了满足这一需求,Android平台提供了多种解决方案,包括使用第三方库如友盟、ShareSDK...
“Android 隐式Intent 的实例详解” Android 隐式Intent 是一种特殊的 Intent,用于在不明确设置激活对象的前提下寻找最匹配的组件。它的核心思想是通过在 AndroidManifest.xml 文件中设置意图过滤器,来指定 ...