1. public class Intent implements Parcelable, Cloneable {   //... private String mAction;
  2. private Uri mData;
  3. private String mType;
  4. private String mPackage;
  5. private ComponentName mComponent;
  6. private int mFlags;
  7. private HashSet<String> mCategories;
  8. private Bundle mExtras;
  9. private Rect mSourceBounds;

转自:http://blog.csdn.net/annkie/article/details/8483253

Intent也是继承了Parcelable的接口。

个人理解,Intent应该只是一个数据参数的载体,真正将两个Acitivity/Service通信起来的是Binder接口(C/S架构)。

第一类:简单或基本数据类型

  1. Intent putExtra(String name, int[] value)
  2. Intent putExtra(String name, float value)
  3. Intent putExtra(String name, byte[] value)
  4. Intent putExtra(String name, long[] value)
  5. Intent putExtra(String name, float[] value)
  6. Intent putExtra(String name, long value)
  7. Intent putExtra(String name, String[] value)
  8. Intent putExtra(String name, boolean value)
  9. Intent putExtra(String name, boolean[] value)
  10. Intent putExtra(String name, short value)
  11. Intent putExtra(String name, double value)
  12. Intent putExtra(String name, short[] value)
  13. Intent putExtra(String name, String value)
  14. Intent putExtra(String name, byte value)
  15. Intent putExtra(String name, char[] value)
  16. Intent putExtra(String name, CharSequence[] value)

本质上仍然是通过一个Bundle(private Bundle mExtras;)来实现:

  1. public Intent putExtra(String name, long value) {
  2. if (mExtras == null) {
  3. mExtras = new Bundle();
  4. }
  5. mExtras.putLong(name, value);
  6. return this;
  7. }

第二类:传递一个Bundle

  1. public Intent putExtra(String name, Bundle value) {
  2. if (mExtras == null) {
  3. mExtras = new Bundle();
  4. }
  5. mExtras.putBundle(name, value);
  6. return this;
  7. }

第三类:传递Serializable对象

  1. public Intent putExtra(String name, Serializable value) {
  2. if (mExtras == null) {
  3. mExtras = new Bundle();
  4. }
  5. mExtras.putSerializable(name, value);
  6. return this;
  7. }

第四类:Parcelable对象

  1. public Intent putExtra(String name, Parcelable value) {
  2. if (mExtras == null) {
  3. mExtras = new Bundle();
  4. }
  5. mExtras.putParcelable(name, value);
  6. return this;
  7. }
  8. public Intent putExtra(String name, Parcelable[] value) {
  9. if (mExtras == null) {
  10. mExtras = new Bundle();
  11. }
  12. mExtras.putParcelableArray(name, value);
  13. return this;
  14. }

第五类:Intent

  1. public Intent putExtras(Intent src) {
  2. if (src.mExtras != null) {
  3. if (mExtras == null) {
  4. mExtras = new Bundle(src.mExtras);
  5. } else {
  6. mExtras.putAll(src.mExtras);
  7. }
  8. }
  9. return this;
  10. }

归根结底都是通过Bundle来实现数据封装。而Bundle则是通过Map的数据结构来存储数据。

mMap = new HashMap<String, Object>();

mParcelledData

两者同时只有一个有效。

一旦unparcel以后,mParcelledData

的数据将被填充到mMap中,同时值为null。在writeToParcel和readFromParcel中则直接使用mParcelledData.此时一般通过IBinder关联两个进程的通信。

关于Bundle则是实现了Parcelable接口的类,通过上面提到的HashMap和一个Parcel来存储数据。

  1. public final class Bundle implements Parcelable, Cloneable {
  2. private static final String LOG_TAG = "Bundle";
  3. public static final Bundle EMPTY;
  4. static {
  5. EMPTY = new Bundle();
  6. EMPTY.mMap = Collections.unmodifiableMap(new HashMap<String, Object>());
  7. }
  8. // Invariant - exactly one of mMap / mParcelledData will be null
  9. // (except inside a call to unparcel)
  10. /* package */ Map<String, Object> mMap = null;
  11. /*
  12. * If mParcelledData is non-null, then mMap will be null and the
  13. * data are stored as a Parcel containing a Bundle.  When the data
  14. * are unparcelled, mParcelledData willbe set to null.
  15. */
  16. /* package */ Parcel mParcelledData = null;
    1. public void putFloat(String key, float value) {
    2. unparcel();//首先解析出mParcelledData到mMap
    3. mMap.put(key, value);
    4. }
    5. /* package */ synchronized void unparcel() {
    6. if (mParcelledData == null) {
    7. return;
    8. }
    9. int N = mParcelledData.readInt();
    10. if (N < 0) {
    11. return;
    12. }
    13. if (mMap == null) {
    14. mMap = new HashMap<String, Object>();
    15. }
    16. mParcelledData.readMapInternal(mMap, N, mClassLoader);
    17. mParcelledData.recycle();
    18. mParcelledData = null;//回收以后值为null
    19. }

Android:Intent传递数据的几种类型和源码实现的更多相关文章

  1. Android Intent传递数据

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent传递数据. 我们利用显示的方式进行Intent的启动. 1.启动intent并输入数据. Intent intent=new In ...

  2. Android Intent 传递数据注意事项

    不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction缓存为 1MB),可能导致 OOM.

  3. 【转】Android 之最新最全的Intent传递数据方法

    原文地址:https://www.jianshu.com/p/1169dba99261 intent传递数据 为什么要和intent单独拿出来讲,因为Intent传递数据也是非常重要的 一.简单的传递 ...

  4. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  5. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及 它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.shor ...

  6. Android学习之Intent传递数据

    Intent在Activity中的作用主要是有两个: 1.启动目标Activity 2.传递数据 Intent在传递数据时分两种情况:向下一个Activity传递数据和从下一个Activity返回数据 ...

  7. Android Activity传递数据使用getIntent()接收不到,揭秘Intent传递数据与Activity启动模式singleTask的关系。

    activity通过intent传递数据的时候,如果activity未启动,那么在这个刚启动的activity里通过getIntent()会获取到这个intent的数据.. 如果要启动的activit ...

  8. 安卓通过putExtra传递数据的几种方式

    通过intent传递数据时,使用以下代码报错: hMap<string, object=""> map=(Map<string, object="&qu ...

  9. Intent传递对象的几种方式

    原创文章.转载请注明 http://blog.csdn.net/leejizhou/article/details/51105060 李济洲的博客 Intent的使用方法相信你已经比較熟悉了,Inte ...

随机推荐

  1. git 入门 2

    进入d盘,新建project文件, 右键,git bash here cd project 初始化 $ git init 克隆项目 $ git clone http://192.168.1.188:3 ...

  2. [BS-18] 对OC中不可变类的理解

    对OC中不可变类的理解 OC中存在很多不可变的类(如NSString,NSAttributedString,NSArray,NSDictionary,NSSet等),用它们创建的对象存在于堆内存中,但 ...

  3. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

  4. Android Framework框架_转

    选自<Android内核剖析> Framework定义了客户端组件和服务端组件功能及接口.包含3个主要部分:服务端,客户端和Linux驱动. (一)服务端 服务端主要包含两个重要类,分别是 ...

  5. javaScirpt学习之事件

    一.事件的添加和删除 不同浏览器,不同DOM级别,添加和删除事件的方法也不同,具体可以参见后面的EventUtil元素. 二.事件对象 在事件处理程序中,浏览器会为之传入一个event对象,该对象的常 ...

  6. ajax请求后加额外的数据

    $.ajax({ cache: true, type: "POST", url:"${ctx!}/bus/trail/getTrailInfoById", da ...

  7. 使用已有PDB克隆PDB

    使用已有PDB克隆PDB $ sqlplus '/as sysdba' SQL*Plus: Release Production on Tue Jun :: Copyright (c) , , Ora ...

  8. mysql:键缓存

    myisam的主要优化参数: key_buffer_size - 这对MyISAM表来说非常重要,是用来设置整个MySQL中常规Key Cache的大小.一般来说,如果MySQL运行在32位平台,此值 ...

  9. 利用JAVA计算TFIDF和Cosine相似度-学习版本

    写在前面的话,既然是学习版本,那么就不是一个好用的工程实现版本,整套代码全部使用List进行匹配效率可想而知. [原文转自]:http://computergodzilla.blogspot.com/ ...

  10. eclipse JAVA 类元素 快速添加set和get方法

    鼠标在代码窗口,鼠标右键 然后选择如下图 然后在下面图中,选择需要个类的元素添加的set和get 选择好了点击OK,这样eclipse就自动生成get和set方法