Android应用程序有三个核心组件---Activity、Service、Broadcast Receiver,Broadcast receiver是通过叫做Intent的消息来激活的。Intent消息是同一个应用程序或不同应用程序运行后,组件间进行绑定的一种能力。Intent对象本身是一个持有要执行操作的抽象描述的无源数据结构,或者在广播的情况下,经常用它来描述一些已经发生或正在发生的事情。给每种类型组件发送Intent对象都有其独立的机制:
1.为了做某些新的操作,把一个Intent对象传递给Context.startActivity()或Activity.startActivityForResult()方法来启动一个新的Activity或者获取一个既存的Activity。调用startActivityForResult()方法启动的那个Activity也能够把Intent对象传递给Activity.setResult()方法来返回响应的信息。
2.把一个Intent对象传递给Context.startService()方法来初始化一个服务或给一个正在运行的服务发送新的指令。类似地,也能把Intent对象传递给Context.bindService()方法,在调用组件和目标服务之间建立一个连接,如果服务还没有运行可以选择启动。
3.传递给广播方法(如,Context.sendBroadcast()、Context.sendOrderedBroadcast()、或Context.sendStickyBroadcast()方法)的任何Intent对象都被发送给所有的感兴趣的广播接收器。广播的许多类型源于系统代码。
在每种情况下,Android系统都会查找对应的Activity、Service或Broadcast Receiver的设置来响应这个Intent对象,如果需要也会实例化这些组件。在这些消息系统内部没有消息重叠:广播的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对象中的其他信息来定位合适的目标。
组件名是通过setComponent()、setClass()或setClassName()方法来设置,并且通过getComponent()方法来读取。
动作(Action)
指的是一个要执行的动作的命名字符串,在广播Intent对象的情况下,指的是已经发生和正在报告的动作。Intent类定义很多动作常量,详见下表:
常量
|
目标组件
|
动作
|
ACTION_CALL
|
Activity
|
发起电话呼叫
|
ACTION_EDIT
|
Activity
|
为用户显示要编辑的数据
|
ACTION_MAIN
|
Activity
|
作为一个任务的初始Activity启动,没有数据输入和返回输出。
|
ACTION_SYNC
|
Activity
|
用移动设备上的数据同步服务上的数据。
|
ACTION_BATTERY_LOW
|
Broadcast Receiver
|
低电量的一个警告
|
ACTION_HEADSET_PLUG
|
Broadcast Receiver
|
耳麦已经被插入设备,或者从设备上拔出。
|
ACTION_SCREEN_ON
|
Broadcast Receiver
|
显示屏已经被打开
|
ACTION_TIMEZONE_CHANED
|
Broadcast Receiver
|
时区相关的设置已经被改变
|
对于一般性动作的预定义常量列表,请看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对象中。跟action的动作一样,Intent类也定义几个分类常量,如下表:
常量
|
含义
|
CATEGORY_BROWSABLE
|
目标Activity能够安全的调用浏览器来显示链接所指向的数据---如,一张图片或一封电子邮件消息。
|
CATEGORY_GADGET
|
Activity能够被嵌入到持有小部件的另一个Activity中
|
CATEGORY_HOME
|
Activity显示在主屏幕上,在设备打开时用户看到的第一个屏幕或Home按钮被按下时,用户看到的屏幕。
|
CATEGORY_LAUNCHER
|
Activity能够作为任务的初始Activity,并且被列在应用程序启动器的顶层。
|
CATEGORY_PREFERENCER
|
目标Activity是一个首选面板。
|
完整的分类列表请看Intent类的说明。
addCategory()方法把一个分类放到一个Intent对象中,removeCategory()方法删除先前添加的分类,getCategories()方法获取当前Intent对象中的所有分类设置。
附加信息(Extras)
它是以Key-value对的形式发送给处理这个Intent对象的组件的附加信息。就像某些数据URIs要跟动作配对一样,某些特殊的附加信息也需要配对。如,一个ACTION_TIMEZONE_CHANGED类型的Intent对象有一个指定新时区的time-zone附加信息,ACTION_HEADSET_PLUG类型的Intent对象有一个指示耳麦当前是插入还拔出状态的附加信息,对于耳麦类型还有一个name的附加信息。如果你创建了一个SHOW_COLOR动作,颜色值应该被设置在一个key-value对的附加信息中。
Intent对象为插入各种类型的附加数据会有一系列的put…()方法,并为读取数据也会有一组类似的get…()方法。这些方法并行于Bundle对象一些方法。实际上,附加信息能够作为一个Bundle对象使用putExtras()和getExtras()方法来安装和读取。
标记(Flags)
Intent对象有各种标记,很多都是用于指示Android系统如何启动Activity(如,Activity应该属于哪个任务),以及启动后如何处理(如,它是否属于最近的Activity列表)。所有这些标记都在Intent类中定义。
Android系统和平台相关的应用都采用Intent对象来发出面向系统的广播和激活系统定义的组件。
注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。
如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar
分享到:
相关推荐
Intent过滤器(Intent Filter)是注册在AndroidManifest.xml中的规则集,用于声明组件能响应哪些类型的Intents。过滤器包含动作、数据和种类的定义,用于匹配Intent的对应属性。 ##### 3.1.1 动作检测 系统检查...
3.1.1 动作检测:过滤器可以指定一组动作,只有动作匹配的 Intent 才会被接收。 3.1.2 种类检测:过滤器可以声明组件能处理的数据类型,即 MIME 类型。 3.1.3 数据检测:过滤器可以包含数据模式,如 URI 的路径或...
#### 一、意图和意图过滤器Intents and Intent Filters 在Android开发中,意图(Intents)是一种重要的通信机制,用于实现应用内部以及不同应用间的交互。它允许一个组件(如Activity、Service或BroadcastReceiver...
在Android中,`Intent`是一种消息对象,它用于启动活动或服务,也可以用于传递数据。为了实现分享功能,我们需要创建一个`Intent`并指定其动作(Action),例如`Intent.ACTION_SEND`。此外,还需要设置要分享的数据...
Intent过滤器 Activity和任务 Affinity(吸引力)和新任务 加载模式 清理堆栈 启动任务 进程和线程 进程 线程 远程过程调用 线程安全方法 组件生命周期 Activity生命周期 调用父类 服务生命周期 广播接收器生命周期 ...
Intent可以带有额外的数据和动作,接收者通过Intent过滤器来声明它能够响应的Intent类型。 - 进程和线程(Processes and Threads):Android系统会管理应用程序的进程和线程。当系统需要释放资源时,可能会杀死一个...
6. Intents和Intent过滤器:Android应用通过Intent进行通信,启动新的活动或服务。个人理财通可能使用Intent来触发不同功能,比如打开新的活动或者发送通知。 7. 文件存储:除了SQLite数据库,应用可能还会使用内部...
Intent过滤器 8 Activity和任务 10 Affinity(吸引力)和新任务 11 加载模式 12 清理堆栈 13 启动任务 14 进程和线程 14 进程 15 线程 15 远程过程调用 15 线程安全方法 16 组件生命周期 17 Activity生命周期 17 ...
2. Intent与Intent过滤器(Intents and Intent Filters): - Intent是一种消息传递机制,用于组件之间的通信。它允许开发者启动一个新的Activity,传递数据给Service,或者发送广播。 - Intent过滤器用于声明组件...
**Intent和Intent过滤器(Intents and Intent Filters)** Intent是一种在Android组件之间进行交互的机制,可以启动一个活动、服务或者传递广播。Intent过滤器是用于指定一个组件能够响应哪一种Intent的声明,位于...
#### 五、意图和意图过滤器 - Intents and Intent Filters **1. 意图过滤器 - Intent Filters** - **意图过滤器**: Intent 过滤器定义了组件可以响应哪些 Intent 类型。这是通过在 AndroidManifest.xml 文件中声明...
5. **Intent和Intent过滤器(Intents and Intent Filters)**:Intent是Android中的消息对象,用于启动活动、服务或者广播。Intent过滤器则用于声明一个组件可以响应哪些Intent,这在AndroidManifest.xml文件中配置...
最后,确保在你的应用中正确配置了ZXing的Intent过滤器,这样当用户点击扫描按钮时,系统会启动相机并显示扫描界面。扫描完成后,ZXing会将结果通过Intent返回到你的应用,然后在`onActivityResult`方法中处理。 总...
Intent过滤器可以指定组件响应的动作(action)、数据(data)和类别(category)。 **1.7 Activity和任务** - **任务(Task)**: 一组按顺序启动的Activity,它们共享相同的back stack。 - **Affinity**: 用于控制...
##### Intent过滤器(Intent Filters) 在`AndroidManifest.xml`文件中,可以为组件添加`<intent-filter>`标签来指定组件响应哪些类型的`Intent`。这使得组件可以在适当的情况下被系统自动激活。 #### 四、Activity...
- Intents与Intent过滤器:详述Intent的作用,如何通过Intent跳转活动和服务,以及IntentFilter的配置。 - Fragment管理:分析Fragment的生命周期,以及如何在活动中添加、移除和替换Fragment。 - 回调方法:讲解...