点击打开链接
intent组成: 组件名、action动作、data数据、category分类、extras附加信息、flag标记
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。 因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,调用startActivity (Intent intent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的 Activity。
Intent消息是同一个应用程序或不同应用程序运行后,组件间进行绑定的一种能力。(组件有4 :Activity、Service、Broadcast Receiver、Content Provider,也可以说有3个核心组件---除去Content Provider)
Intent对象本身是一个持有要执行操作的抽象描述的无源数据结构。
给每种类型组件发送Intent对象都有其独立的机制:
1. 为了做某些新的操作,把一个Intent对象传递给Context.startActivity()或Activity.startActivityForResult()方法来启动一个新的Activity或者获取一个既存的Activity。
2. 把一个Intent对象传递给Context.startService()方法来初始化一个服务或给正运行的服务发送新的指令。类似地,也能把Intent对象传递给Context.bindService()方法,在调用组件和目标服务之间建立一个连接,如果服务还没有运行可以选择启动。
3. 传递给广播方法(如,Context.sendBroadcast()、Context.sendOrderedBroadcast()、或Context.sendStickyBroadcast()方法)的任何Intent对象都被发送给所有的感兴趣的广播接收器。广播的许多类型源于系统代码。
在每种情况下,Android系统都会查找对应的组件(Activity、Service或Broadcast Receiver)的设置来响应这个Intent对象,如果需要也会实例化这些组件(如启动activity)。
在这些消息系统内部没有消息重叠:广播的Intent对象仅发送给Broadcast Receiver组件,不会发送给Activity或Service组件。在这些消息系统内部没有消息重叠:广播的Intent对象仅发送给Broadcast Receiver组件,不会发送给Activity或Service组件。传递给startActivity()方法的Intent对象仅发送给一个Activity,不会发送给一个Service或Broadcast Receiver组件,等等。
本文档开始介绍Intent对象,然后介绍Android使用的把Intent对象映射给组件的规则---Android系统是如何解析那个组件应该接收对应的Intent消息。
对于没有明确命名目标组件的Intent对象,这个过程涉及用与潜在的目标关联Intent过滤器来检测Intent对象。
Intent 对象
一个Intent对象就是一个信息包。它包含了接收这个Intent对象的组件感兴趣的信息(包含接收组件感兴趣的信息,如要执行的动作和动作相关的数据),和android系统感兴趣的信息(如接收Intent对象组件的分类和有关如何启动目标Activity的指令,如指定单例模式)。
这些信息主要包含以下信息:
组件名 ---目标组件的完全类名和组件所在程序清单文件设置的包名的组合
指的是能够处理Intent对象的组件的名字。这个字段是一个ComponentName对象---它是目标组件的完全类名(如:com.example.project.app.FreneticActivity)和组件所在的应用程序的清单文件中设置的包名(如:com.example.project)的组合。组件名的包部分和清单文件中设置的包名不一定一致。
组件名是可选的,如果设置了组件名,Intent对象就会被发送给这个指定类的实例。如果没有设置,Android系统使用Intent对象中的其他信息来定位合适的目标。
动作(Action)---要执行动作的命名字符串
指的是一个要执行的动作的命名字符串,在广播Intent对象的情况下,指的是已经发生和正在报告的动作。
对于一般性动作的预定义常量列表,请看Intent类说明。在Android API的其他地方还定义了一些其他的动作。你也可以在自己的应用程序中给Activity组件定义自己的动作字符串。你创建这些动作应该包含应用程序的包名作为动作前缀---例如:com.example.project.SHOW_COLOR.
动作在很大程度上决定了Intent类的结构---特别是data和extras字段---如一个方法名决定了一组参数和一个返回值。由于这个原因,尽可能的指定使用动作的名字是个好主意,并且要把它们与Intent的其他字段紧密的捆绑在一起。换句话说,就是要给你的组件能够处理的Intent对象定义一个完整的协议,而不是定义一个独立的动作。
Intent对象中的动作是由setAction()方法设定的,并且有getAction()方法读取的。
数据(Data) --- 与动作相关的资源标识
指的是动作相关的数据的资源标识和数据的MIME类型。不同的动作要跟不同的数据规范类型配合使用。如果动作字段是ACTION_EDIT,那么数据字段应该包含为编辑而显示的数据的资源标识(URI)。如果动作时ACTION_CALL,那么数据字段就应该是tel:带有呼叫号码的URI。类似地,如果动作时ACTION_VIEW,并且数据字段是http:URI。那么接收Activity就应该下载并显示URI所指向的数据。
在把一个Intent对象分配给一个有处理数据能力的组件时,了解附件在URI中的数据类型是至关重要。例如,能够显示图片的组件不应该被调用来播放音频文件。
很多情况下,从URI中能够推断出数据类型---特别是content:URIs,它指明了设备上数据的位置和控制数据的内容提供器。但是数据类型也能够在Intent对象中明确的设定。setData()方法只能给URI指定数据,setType()方法只能给数据指定MIME类型,setDataAndType()方法同时指定URI的数据和数据的MIME类型。通过getData()方法读取数据,getType()方法获取数据类型。
分类(Category) ---
指的是包含能够处理这个Intent对象的组件类型的相关信息的字符串。任何类别的分类描述都能够被放在Intent对象中。
CATEGORY_LAUNCHER |
Activity能够作为任务的初始Activity,并且被列在应用程序启动器的顶层。 |
附加信息(Extras)---以键值对形式数据
它是以Key-value对的形式发送给处理这个Intent对象的组件的附加信息。
Intent对象为插入各种类型的附加数据会有一系列的put…()方法,并为读取数据也会有一组类似的get…()方法。这些方法并行于Bundle对象一些方法。实际上,附加信息能够作为一个Bundle对象使用putExtras()和getExtras()方法来安装和读取。
标记(Flags)---
Intent对象有各种标记,很多都是用于指示Android系统如何启动Activity(如,Activity应该属于哪个任务),以及启动后如何处理(如,它是否属于最近的Activity列表)。所有这些标记都在Intent类中定义。
Android系统和平台相关的应用都采用Intent对象来发出面向系统的广播和激活系统定义的组件。