Android开发系列3——Intent详解

前言

  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
隐式 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_MAINandroid.intent.action.MAIN应用程序入口
ACTION_VIEWandroid.intent.action.VIEW查看指定数据
ACTION_ATTACH_DATAandroid.intent.action.ATTACH_DATA指定某块数据将被附加到其他地方
ACTION_EDITandroid.intent.action.EDIT编辑指定数据
ACTION_PICKandroid.intent.action.PICK从列表中选择某项,并返回所选的数据
ACTION_CHOOSERandroid.intent.action.CHOOSER显示一个Activity选择器
ACTION_GET_CONTENTandroid.intent.action.GET_CONTENT让用户选择数据,并返回所选数据
ACTION_DIALandroid.intent.action.DIAL显示拨号面板
ACTION_CALLandroid.intent.action.CALL直接向之指定用户打电话
ACTION_SENDandroid.intent.action.SEND向其他人发送数据
ACTION_SENDTOandroid.intent.action.SENDTO向其他人发送消息
ACTION_ANSWERandroid.intent.action.ANSWER应答电话
ACTION_INSERTandroid.intent.action.INSERT插入数据
ACTION_DELETEandroid.intent.action.DELETE删除数据
ACTION_RUNandroid.intent.action.RUN运行数据
ACTION_SYNCandroid.intent.action.SYNC执行数据同步
ACTION_PICK_ACTIVITYandroid.intent.action.PICK_ACTIVITY用于选择Activity
ACTION_SEARCHandroid.intent.action.SEARCH执行搜索
ACTION_WEB_SEARCHandroid.intent.action.WEB_SEARCH执行Web搜索
ACTION_FACTORY_TESTandroid.intent.action.FACTORY_TEST工厂测试的入口点
2.3 Category (类别)

一个包含处理Intent组件类型的附加信息的字符串。可以将任意数量的类别描述放入一个Intent中,但大多数Intent都不需要类别。

Category常量对应字符串简单说明
CATEGORY_DEFAULTandroid.intent.category.DEFAULT默认的Category
CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE指定该Activity能被浏览器安全调用
CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHERActivity显示顶级程序列表
CATEGORY_INFOandroid.intent.category.INFO用于提供包信息
CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_TESTandroid.intent.category.TEST该Activity是一个测试
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE该Activity是参数面板
CATEGORY_CAR_DOCKandroid.intent.category.CAR_DOCK指定手机被插入汽车底座(硬件)时运行该Activity
CATEGORY_DESK_DOCKandroid.intent.category.DESK_DOCK指定手机被插入桌面底座(硬件)时运行该Activity
CATEGORY_CAR_MODEandroid.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。

持续更新中……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值