什么是Intent?

Intent是一个消息传递对象,可以使用它来启动其它应用组件。Intent使组件之间通信更加便利,主要用于以下三点:

启动Activity:

可以将intent作为参数调用Context.startActivity(intent)方法启动一个Activity。此时该Intent对象描述了将要启动的目标Activity名称及相关数据信息。同时还可以调用startActivityForResult()方法回传信息。

启动Service:

Service是一个常用于在后台执行操作的组件。可以使用Context.startService(intent)在后台启动一个Service。同样的使用bindService(intent)也需要用到Intent参数。

发送Broadcast:

Broadcast是一种可以被应用程序截获的广播机制。可以通过调用sendBroadcast(intent),sendOrderedBroadcast(intent),sendStickyBroadcast(intent)方法发送一条广播。

可以看到,四大组件中的Activity, Service, Broadcast的启动或发送都需要用到Intent。

Intent的类型

显示Intent:指按名称(完全限定类名)指定要启动的组件。通常在启动自己编写的组件时需要使用显示Intent。

隐式Intent:指不指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。

创建隐式
Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent
过滤器进行比较,从而找到要启动的相应组件。 如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent
对象。 如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。
Intent
过滤器是应用清单文件中的一个表达式,它指定该组件要接收的 Intent 类型。 例如,通过为 Activity 声明 Intent
过滤器,您可以使其他应用能够直接使用某一特定类型的 Intent 启动 Activity。同样,如果您没有为 Activity 声明任何
Intent 过滤器,则 Activity 只能通过显式 Intent 启动。
注意:为了确保应用的安全性,启动Service时,请始终使用显示Intent,且不要为服务声明Intent过滤器。使用隐式Intent启动服务存在安全隐患,因为您无法确定哪些服务将响应Intent,且用户无法看到哪些服务已经启动。从Android5.0(API
21)开始,如果使用隐式Intent调用bingService(),系统会引发异常。

Intent包含哪些信息?

Intent的源码中定义了如下关键属性:

private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private ArraySet<String> mCategories;
private Bundle mExtras;
private Rect mSourceBounds;
private Intent mSelector;
private ClipData mClipData;
private int mContentUserHint = UserHandle.USER_CURRENT;

Action 操作
指定要执行的通用操作的字符串。对于广播 Intent,这是指已发生且正在报告的操作。操作在很大程度上决定了其余 Intent 的构成,特别是数据和 extra 中包含的内容。一些用于启动Activity的常见操作:
ACTION_VIEW:如果有一些某项 Activity 可向用户显示的信息(例如,要使用图库应用查看的照片;或者要使用地图应用查看的地址),可使用 Intent 将此操作与 startActivity() 结合使用。 
ACTION_SEND:也称为“共享”Intent。如果有一些用户可通过其他应用(例如,电子邮件应用或社交共享应用)共享的数据,则应使用Intent将此操作与 startActivity() 结合使用。

Data 数据
引用待操作数据和/或该数据
MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定。例如,如果操作是
ACTION_EDIT,则数据应包含待编辑文档的 URI。 创建 Intent 时,除了指定 URI 以外,指定数据类型(其 MIME
类型)也很重要。

ComponentName 组件名称
构建显示Intent的必要信息。如果没有ComponentName,则表示Intent是隐式的。

Type 类别
一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。 以下是一些常见类别: 
CATEGORY_BROWSABLE:目标Activity允许本身通过网络浏览器启动,以显示链接引用的数据,如图像或电子邮件。 
CATEGORY_LAUNCHER:该Activity是任务的初始Activity,在系统的应用启动器中列出。

Extra 
用于携带完成请求操作所需的附加信息的键值对。正如某些操作使用特定类型的数据 URI 一样,有些操作也使用特定的 extra。 
可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将Bundle 插入 Intent 中。

Intent可以传递Bitmap吗?

查看Intent的源码中,有一个putExtra(String name, byte[] value)方法:

public Intent putExtra(String name, byte[] value) {
if (mExtras == null) {
mExtras = new Bundle();
   }
mExtras.putByteArray(name, value);
   return this;
}

可以将Bitmap转化成byte[]进行传递。经测试intent是可以传递bitmap的。

但是,在测试过程中发现,传递的一张500多k的图片是出错了

JavaBinder: !!! FAILED BINDER TRANSACTION !!!

显然,是传输的图片过大,超出了Binder传输的限制了。因为启动另一个Activity的过程中,需要与AMS进程进行Binder通信。(关于Binder通信机制下次详细介绍)

Binder通信过程中,会发生一次内存拷贝,显示,传输的数据越小效率就越高。因此,不建议使用Intent传递比较大的数据。

Intent和PendingIntent的区别

Intent 是及时启动,intent 随所在的activity 消失而消失。

PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。

Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装。

Intent讲解的更多相关文章

  1. 最全面的Android Intent机制讲解

    对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...

  2. Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解

    前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...

  3. Intent系列讲解---Intent简介以及相关属性

    一.Intent简介 Intent中文是"意图,意向",它是Android中四大组件通讯的纽带,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Androi ...

  4. Activity系列讲解---返回结果的处理

    设想一下:由当前Activity跳转到其它Activity,从其它Activity再返回到当前Activity时,如何获取其它Activity存放的数据?下面用一个例子讲解, 点击selsect按钮跳 ...

  5. 我的Android第五章:通过Intent实现活动与活动之间的交互

    Intent在活动的操作 作用: Itent是Android程序中各个组件直接交换的一个重要方式可以指定当前组件要执行任务同时也可以给各个组件直接进行数据交互              同时Inten ...

  6. Intent之复杂数据的传递

    想在两个Activity之间传递一个对象Result,在网上差了很多,都需要序列化或者时下Paracelable,等等,试了很多都不行. 后来才制单,这个Result,根本不需要集成Sereriabl ...

  7. Activity Intent Flags及Task相关属性

    转自http://www.cnblogs.com/lwbqqyumidi/p/3775479.html 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式 ...

  8. Intent实现Activity组件之间的通信

    今天讲解的是使用Intent实现Activity组件之间的通信. 一.         使用Intent显式启动Activity,Activity1àActivity2 1.             ...

  9. Android总结篇系列:Activity Intent Flags及Task相关属性

    同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...

随机推荐

  1. 常见URL字符及URL编码值

    大家上网的时候一定会看到很多这类情况有的网页地址都是%22%32%11%23%21等这种机器语言恐怕只有机器能马上辨认吧现在我把大概知道的总结一下 字符                         ...

  2. C#解析XML文件

    想实现:C#读取XML文件内的内容至List XML文件:AppAttr.xml  其中,一定是要ArrayOfAppAttr(红色部分AppAttr为你的实体类名) <?xml version ...

  3. 转:Mosquitto用户认证配置

    转自:https://blog.csdn.net/u012377333/article/details/69397124?utm_source=blogxgwz1 前言:基于Mosquitto服务器已 ...

  4. django.db.utils.OperationalError: no such table: auth_user

    关于使用django 首次创建超级管理员时,出现     django.db.utils.OperationalError: no such table: auth_user   错误 1.首先使用命 ...

  5. angularAMD快速入门

    ngularAMD是作者 marcoslin 使用 RequireJS + AngularJS开发的前端mvvm框架,因此你可以使用它快速创建一款Web App.他特别适合快速开发SPA应用,适当的和 ...

  6. 【Material Design视觉设计语言】应用布局设计

    [Material Design视觉设计语言]章节列表 [Material Design视觉设计语言]开篇 [Material Design视觉设计语言]Material Design设计概述 [Ma ...

  7. Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器client(1)-墨卡托投影与坐标控制

    (相关的代码能够从https://github.com/goldenhawking/mercator.qtviewer.git直接克隆) 我们如今是准备做一个C/S架构的地图显示控件.就必定牵扯到坐标 ...

  8. angular学习疑问总结

    服务里返回的数据是不是只能传给控制器,而不能传给指令呢?如果是的话那么指令只能通过配置scope属性来访问控制器里的数据

  9. CCOrbitCamera

    Cocos2d-x提供了一中根据球面坐标轨迹旋转的方式CCOrbitCamera CC_DEPRECATED_ATTRIBUTE static CCOrbitCamera* actionWithDur ...

  10. CWidgetMgr---cpp

    #include "WidgetMgr.h" #include "XWidget.h" #include "Config.h" #inclu ...