Intent作为组件之间通信的手段和协议,包含了诸如Action、Data、Type、Category、Component、Extras和Flags等数据项,各自拥有各自的含义和作用。当调用组件发出一个intent的时候,组件管理器会根据所设置的这些数据项来评判应该创建和启动哪个或者哪些被调用组件。

总结如下:

Action

作为通信的动作的主题,相当于一句话主谓宾中的谓语(主语即调动组件自己)。比如“我要某人打开一张图片”,Action即“打开”的意思。Action的名字遵从java的包名定义的方式从而保证了唯一性,比如com.company.sample.action.ACTION_OPEN。

标准的Action比如Intent.ACTION_SEND,Intent.ACTION_VIEW等

Data

表达了动作所带有的操作目标,相当于“我要某人打开一张图片”中的一张图片的意思,即宾语。表示这个动作所附带的主体数据是什么。通过Intent.setData或者Intent.setDataAndType来设置,为字符串格式,格式通常用URI来表示。一个URI通常带有scheme、host、port、path等字段。比如一个表示本地的一个文件的data大致为:

file:///sdcard/file.txt

或者是请求一个web的URI:

http://www.baidu.com/main/1

Type

描述了操作目标的类型需求,通常和Data字段的设置是互斥的,即若设置了Type则前头设置的Data会被清掉。一般来说Data用于特指的数据,Type用于泛指的数据。

比如ACTION_SEND这个action要发送一个图片时,应该用Intent.setType来设置万类型为"image/jgp"表示被调用组件是能够打开图片类型的,但是实际上被调用组件可以有多个,当有多个的时候则会出现组件选择框。

而ACTION_SENDTO这个action通常已经制定了调用组件,所以通常用setData来设置操作目标。

有时候Data和Type是相铺相成的需要同时设置,比如打开一张图片,即需要说明type类型,又要给出图片文件的位置,那么这个时候需要用intent.setDataAndType("file:///sdcard/img.data","image/jpg")

Category

表述了一个附件条件,如果说“我要某人打开一张图片”是有条件的,条件是这个某人是个大学生,那么“大学生”就是这个category。

系统默认的几个category中最常见的就是Intent.CATEGORY_LAUNCHER了,每一个app的入口activity在manifest中都要加入Intent.CATEGORY_LAUNCHER这个category的描述。事实上是为了让homescreen程序在点击这个app的时候能够找到这个入口activity。所以说Homescreen程序发出来intent给这个所被点击的app的时候加上Intent.CATEGORY_LAUNCHER的category,意图是想进入这个app的入口组件,所以加入了Intent.CATEGORY_LAUNCHER的组件就会被启动

Component

Intent启动组件分类显式(explicit)和隐式(implicit),若给intent设置了component,即Intent.setComponent(或者是setClass)那么表示这个intent已经设置好了要启动哪个组件了,这个时候组件管理器只要老老实实的按照所设置的来启动和创建组件即可。这个时候intent则变成了单纯的信息载体,传递数据给被调用组件使用

Extras

即给intent附带的数据。负责将数据从调用组件传递到被调用组件。数据内容是一个android.os.Bundle类型,按照键值对方式存储,它继承了android.os.Parcelable接口,即可序列化和反序列化,这样子既可以在进程间通讯中用来传递。通过intent.setExtras来加入数据,用intent.getExtras来获取数据。android默认的extras类型中大多是和Action相关联的。比如:

ACTION_SEND中用intent.EXTRA_TEXT来保存要发送的文本内容,intent.EXTRA_SUBJECT用来添加内容的主题。

Flags

一些标志位,通常和任务模型和进程模型相关,有的适合安全机制相关,比如FLAG_GRANT_READ_URI_PERMISSION用来给被调用者一次性的免permission的获取数据的权限。

FLAG_ACTIVITY_NEW_TASK标志位被设置后,会在新的任务中创建被调用组件。

intent.setFlags用来清除性的设置新的标志位,intent.addFlags用来保留原有的添加新的标志位

Intent对象若干数据项的含义总结的更多相关文章

  1. JAVA新手笔记 Intent对象和Bundle对象

    Intent对象和Bundle对象 功能主要是在 MainActivity中定义了2个EditText,当用户输入内容,把他传入到第二个活动, 自己新创的活动中,MyActivity中 放在MainA ...

  2. Intent对象详解——使用Intent启动系统组件

    Android的应用程序包含三种重要组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动它们——都是依靠Intent来启动的,Intent就封装了程 ...

  3. Intent 对象在 Android 开发中的应用

    转自(http://www.ibm.com/developerworks/cn/opensource/os-cn-android-intent/) Android 是一个开放性移动开发平台,运行在该平 ...

  4. Intent对象(组件间的通信原理)

    Intent对象是一种可以在运行时动态绑定组件的关键技术,通过使用Intent对象,可以告诉系统你想要实现什么样的操作,也就是Intent对象里面包含的请求内容,请求再由Android操作系统接收到, ...

  5. javascript数据基本定义以及对象{}和数组[]的含义和使用

    一.基本的数据类型 原始类型(简单数据类型.基本数据类型) Undefined类型: 表示声明了变量但未对其初始化时赋予该变量的值.undefined为Undefined类型下的唯一的一个值. Nul ...

  6. 跟 Task 有关的 Intent对象中设置的Flag

    FLAG_ACTIVITY_BROUGHT_TO_FRONT      这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定. FLAG_ACTIVI ...

  7. Intent传递对象的两种方法

    Android为intent提供了两种传递对象参数类型的方法 分别需要使实体类实现Serializable接口.Parcelable接口 首先我们要知道,传递对象,需要先将对象序列化 一.那么为什么要 ...

  8. Android Intent 基本使用及对象构成

    Intent基本使用 Intent可以理解为不同组件通信的媒介或者信使. Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast. 具体方法如下表 ...

  9. intent传值传对象跳转

    intent传值传对象跳转 1.传值 //原activity中存入一个字段 intent = new Intent(From.this, To.class); intent.putExtra(&quo ...

随机推荐

  1. RESTful 服务示例

    WCF服务轻量级服务,可供JS调用 返回值格式:XML.Json 工程结构: 示例代码: using System; using System.Collections.Generic; using S ...

  2. openid和unionId的区别

    转:http://blog.csdn.net/wo849533144long/article/details/50194623

  3. 使用spring框架的JdbcTemplate实现对Oracle数据库的简单操作实例

    最近实现了一个小功能,针对Oracle数据库两张关联表进行查询和修改,因为比较简单,所以选择了spring框架里的JdbcTemplate.JdbcTemplate算是老古董了,是当年spring为了 ...

  4. .NET泛型与非泛型的问题

    泛型集合通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员.下面的泛型类型对应于现有的集合类型:1.List 是对应于 ArrayList ...

  5. 字符串(二)(PHP)

    1.大段文本在PHP中应该如果表示? 答: <?php $str = <<<aaa hello word; fjasdflj fjslad aaa;date_sub() aaa ...

  6. MySQL for Linux错误: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    参考链接:http://www.cnblogs.com/gumuzi/p/5711495.html

  7. mysql事务之二:MySQL隔离级别演示

    登录mysql: mysql -u root -p123456 Mysql 版本号 mysql> select version(); +-------------------------+ | ...

  8. POJ_3740 Easy Finding ——精确覆盖问题,DLX模版

    Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18790   Accepted: 5184 Des ...

  9. json数据url传递到php后台

    1.js进行encodeURI jsonData = encodeURI(jsonData); 2.php进行urldecode $urldecodeJson = urldecode($json); ...

  10. php获取当前月月初至月末的时间戳,上个月月初至月末的时间戳

    当前月 <?php $thismonth = date('m'); $thisyear = date('Y'); $startDay = $thisyear . '-' . $thismonth ...