Intent讲解
什么是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讲解的更多相关文章
- 最全面的Android Intent机制讲解
对于大型软件开发经验较少的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数调用,或者通过库调用接口的方式不太一样.在 Intent 的使用中你看不到直接的函数调用,相对函 ...
- Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解
前言 大家好,给大家带来Android开发工程师文集-Activity生命周期,启动方式,Intent相关介绍,Activity详细讲解的概述,希望你们喜欢 Activity是什么 作为一个Activ ...
- Intent系列讲解---Intent简介以及相关属性
一.Intent简介 Intent中文是"意图,意向",它是Android中四大组件通讯的纽带,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Androi ...
- Activity系列讲解---返回结果的处理
设想一下:由当前Activity跳转到其它Activity,从其它Activity再返回到当前Activity时,如何获取其它Activity存放的数据?下面用一个例子讲解, 点击selsect按钮跳 ...
- 我的Android第五章:通过Intent实现活动与活动之间的交互
Intent在活动的操作 作用: Itent是Android程序中各个组件直接交换的一个重要方式可以指定当前组件要执行任务同时也可以给各个组件直接进行数据交互 同时Inten ...
- Intent之复杂数据的传递
想在两个Activity之间传递一个对象Result,在网上差了很多,都需要序列化或者时下Paracelable,等等,试了很多都不行. 后来才制单,这个Result,根本不需要集成Sereriabl ...
- Activity Intent Flags及Task相关属性
转自http://www.cnblogs.com/lwbqqyumidi/p/3775479.html 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式 ...
- Intent实现Activity组件之间的通信
今天讲解的是使用Intent实现Activity组件之间的通信. 一. 使用Intent显式启动Activity,Activity1àActivity2 1. ...
- Android总结篇系列:Activity Intent Flags及Task相关属性
同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 ...
随机推荐
- javascript使用parseInt函数时需要注意的一些问题
这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt(" ...
- Linux命令-文件处理命令:head
从头开始往下查看文件,区别于从末尾往上查看文件命令tail head -n /etc/services 查看etc目录下面的services文件的前10行内容 head /etc/services 查 ...
- 加解密(校验哈希值、MD5值)
1.计算文本哈希值: public static string ComputeHash(string password) { byte[] buffer = System.Text.Encoding. ...
- Faster RCNN原理分析 :Region Proposal Networks详解
博主的论文笔记: https://blog.csdn.net/YZXnuaa/article/details/79221189 很详细! 另外,关于博主的博客很多拓展知识面: 120篇 深度学习23篇 ...
- java遍历实体类的属性和数据类型以及属性值
遍历实体类的树形和数据类型一级属性值 /** * 遍历实体类的属性和数据类型以及属性值 * @param model * @throws NoSuchMethodException * @throws ...
- [Jobdu] 题目1504:把数组排成最小的数
题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输 ...
- atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践
atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ...
- queue for max elem, pop, push
queue for max elem, pop, push 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人 ...
- yii2 ContentDecorator 和 block 挂件
在做网站的过程中,大部分的页面结构都是相似的.如都有相同的头部和底部.各个页面这样仅仅是中间的部分不同. Yii中的布局文件就是用来实现这样的功能.如: 布局文件:@app/views/layouts ...
- mysql数据库批量操作
批量KILL会话: 1.首先,根据条件将查询到要kill的进程写入文件:如:desc information_schema.processlist; SELECT concat('KILL ',id, ...