前言
Intent:从字面上的意思是:意图;目的;含义;目标。但在Android的开发过程中却扮演了一个非常重要的角色。
一、Intent详解
深入的理解Intent,可以查看Android系统下Intent类的详细介绍:
// 仅仅截取部分代码,分别介绍几种Intent属性
/**
* An intent is an abstract description of an operation to be performed. It
* can be used with {@link Context#startActivity(Intent) startActivity} to
* launch an {@link android.app.Activity},
* {@link android.content.Context#sendBroadcast(Intent) broadcastIntent} to
* send it to any interested {@link BroadcastReceiver BroadcastReceiver} components,
* and {@link android.content.Context#startService} or
* {@link android.content.Context#bindService} to communicate with a
* background {@link android.app.Service}.
*
* <p>An Intent provides a facility for performing late runtime binding between the code in
* different applications. Its most significant use is in the launching of activities, where it
* can be thought of as the glue between activities. It is basically a passive data structure
* holding an abstract description of an action to be performed.</p>
*/
// 中间省去很多内容,如果感兴趣可以自己去Intent类文件详细研究。
public class Intent implements Parcelable, Cloneable{
private String mAction;
private Uri mData;
private String mType;
private String mIdentifier;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private ArraySet<String> mCategories;
@UnsupportedAppUsage
private Bundle mExtras;
private Rect mSourceBounds;
private Intent mSelector;
private ClipData mClipData;
private int mContentUserHint = UserHandle.USER_CURRENT;
/** Token to track instant app launches. Local only; do not copy cross-process. */
private String mLaunchToken;
可以通过Intent类文件了解Intent的属性,以及Intent的使用描述。
一、Intent
Intent是一个消息传递对象,可以通过多种方式促进组件之间的通信,也可以用于从其他应用组件操作。总结其用法主要包括以下三个:
- 启动Activity
Activity通过将Intent传递给startActivity()启动一个新的Activity实例,同时Intent由于描述启动Activity,并携带任何必要的数据。具体启动Activity的例子可以参看:Android开发系列2——Activity页面跳转详解的例子。
- 启动服务
Service 是一个不使用用户界面而在后台执行操作的组件,可以使用 Service 类的方法来启动服务。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。
- 传递广播
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast(),您可以将广播传递给其他应用。
二、Intent 类型
Intent存在两种类型:
-
显式Intent: 通过提供目标应用的软件包名称或完全限定的组件类名来指定可处理 Intent 的应用。通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,您可能会启动您应用内的新 Activity 以响应用户操作,或者启动服务以在后台下载文件。
-
隐式Intent: 不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理。例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
隐式 Intent 如何通过系统传递以启动其他 Activity:[1] Activity A 创建包含操作描述的 Intent,并将其传递给 startActivity()。[2] Android 系统搜索所有应用中与 Intent 匹配的 Intent 过滤器。找到匹配项之后,[3] 该系统通过调用匹配 Activity (Activity B) 的 onCreate() 方法并将其传递给 Intent,以此启动匹配 Activity。
三、Intent详细介绍
Intent:对象携带Android系统用来确定要启动那些组件的信息(例如:准确的组件名称或应当接收该Intent的组件类别),以及收件人组件为了正确执行操作而使用的信息(例如:要采取的操作以及要处理的数据)。
Intent对象内包括7大属性:
1)Component(组件)
2)Action (动作)
3)Category(类别)
4)Data(数据)
5) Type(数据类型)
6)Extras(扩展信息)
7)Flags(标志位)
接下来详细介绍一下7大属性,每种属性怎么使用。
2.1 Component(组件)
Component其实就是Intent启动的组件名称。(这个是可选项)
Intent在使用过程中,常用的方法:setComponent()、setClass()、setClassName()、或Inent()构建函数等,这些方法最终都是设置ComponentName。
2.3 Action (动作)
从字面意思就可以理解Action的作用,Action是一个抽象动作(方法),这个动作具体由那个组件(或者是Activity,或者是BroadCastReceived)来完成,Action并不关心,Action仅仅只是一个字符串。
Android系统提供了大量的Action常量,接下来列举一些常用的:
Action常量 | 对应字符串 | 简要说明 |
---|---|---|
ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
ACTION_VIEW | android.intent.action.VIEW | 查看指定数据 |
ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指定某块数据将被附加到其他地方 |
ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
ACTION_PICK | android.intent.action.PICK | 从列表中选择某项,并返回所选的数据 |
ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 让用户选择数据,并返回所选数据 |
ACTION_DIAL | android.intent.action.DIAL | 显示拨号面板 |
ACTION_CALL | android.intent.action.CALL | 直接向之指定用户打电话 |
ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送消息 |
ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
ACTION_INSERT | android.intent.action.INSERT | 插入数据 |
ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
ACTION_RUN | android.intent.action.RUN | 运行数据 |
ACTION_SYNC | android.intent.action.SYNC | 执行数据同步 |
ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 用于选择Activity |
ACTION_SEARCH | android.intent.action.SEARCH | 执行搜索 |
ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | 执行Web搜索 |
ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
2.3 Category (类别)
一个包含处理Intent组件类型的附加信息的字符串。可以将任意数量的类别描述放入一个Intent中,但大多数Intent都不需要类别。
Category常量 | 对应字符串 | 简单说明 |
---|---|---|
CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该Activity能被浏览器安全调用 |
CATEGORY_TAB | android.intent.category.TAB | 指定Activity作为TabActivity的Tab页 |
CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | Activity显示顶级程序列表 |
CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
CATEGORY_TEST | android.intent.category.TEST | 该Activity是一个测试 |
CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 该Activity是参数面板 |
CATEGORY_CAR_DOCK | android.intent.category.CAR_DOCK | 指定手机被插入汽车底座(硬件)时运行该Activity |
CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机被插入桌面底座(硬件)时运行该Activity |
CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 设置该Activity可在车载环境下使用 |
2.4 Data (数据)
引用待操作数据和或该数据MIME类型的URI;data的类型由Intent的action决定。
2.5 Type(数据类型)
Type是Data数据的类型,Type的设置需要和Data配合使用。
要仅设置数据 URI,请调用 setData()。要仅设置 MIME 类型,请调用 setType()。
2.6 Extra(扩展信息)
Extra 携带完成请求操作所需的附加信息的键值对。正如某些操作使用特定类型的数据 URI 一样,有些操作也使用特定的 extra。
可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将 Bundle 插入 Intent 中。同时可以通过getExtra()方法获取extra数据。
类型 | 作用 |
---|---|
EXTRA_BCC | 存放邮件密送人地址的字符串数组 |
EXTRA_CC | 存放邮件抄送人地址的字符串数组 |
EXTRA_EMAIL | 存放邮件地址的字符串数组 |
EXTRA_SUBJECT | 存放邮件主题字符串 |
EXTRA_TEXT | 存放邮件内容 |
EXTRA_KEY_EVENT | 以KeyEvent对象方式存放触发Intent 的按键 |
EXTRA_PHONE_ NUMBER | 存放调用ACTION_CALL 时的电话号码 |
2.7 Flags(标志位)
标志在 Intent 类中定义,充当 Intent 的元数据。标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,Activity 是否属于最近的 Activity 列表),可以通过setFlags()或者addFlags()可以把标签flag用在Intent中。
类型 | 作用 |
---|---|
FLAG_ACTIVITY_CLEAR_TOP | 相当于SingleTask |
FLAGE_ACTIVITY_SINGLE_TOP | 相当于SingleTop |
FLAG_ACTIVITY_NEW_TASK | 类似于SingleInstance |
FLAG_ACTIVITY_NO_HISTORY | 当离开该Activity后,该Activity将被从任务栈中移除 |
总结
在Android中扮演一个中间层的角色,三大组件Activity、Service、BroadcastReceiver都需要Intent启动,组件需要通过Intent进行启动、数据传递和跳转,可以参考Android开发系列的Activity、Service、BroadcastReceiver等文章,查看使用Intent。
持续更新中……