Android:Intent传递数据的几种类型和源码实现
2013-01-08 22:55
666 查看
public class Intent implements Parcelable, Cloneable { //... private String mAction; private Uri mData; private String mType; private String mPackage; private ComponentName mComponent; private int mFlags; private HashSet<String> mCategories; private Bundle mExtras; private Rect mSourceBounds;Intent也是继承了Parcelable的接口。
个人理解,Intent应该只是一个数据参数的载体,真正将两个Acitivity/Service通信起来的是Binder接口(C/S架构)。
第一类:简单或基本数据类型
Intent putExtra(String name, int[] value) Intent putExtra(String name, float value) Intent putExtra(String name, byte[] value) Intent putExtra(String name, long[] value) Intent putExtra(String name, float[] value) Intent putExtra(String name, long value) Intent putExtra(String name, String[] value) Intent putExtra(String name, boolean value) Intent putExtra(String name, boolean[] value) Intent putExtra(String name, short value) Intent putExtra(String name, double value) Intent putExtra(String name, short[] value) Intent putExtra(String name, String value) Intent putExtra(String name, byte value) Intent putExtra(String name, char[] value) Intent putExtra(String name, CharSequence[] value)
本质上仍然是通过一个Bundle(private Bundle mExtras;)来实现:
public Intent putExtra(String name, long value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putLong(name, value); return this; }
第二类:传递一个Bundle
public Intent putExtra(String name, Bundle value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putBundle(name, value); return this; }
第三类:传递Serializable对象
public Intent putExtra(String name, Serializable value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putSerializable(name, value); return this; }
第四类:Parcelable对象
public Intent putExtra(String name, Parcelable value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putParcelable(name, value); return this; } public Intent putExtra(String name, Parcelable[] value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putParcelableArray(name, value); return this; }
第五类:Intent
public Intent putExtras(Intent src) { if (src.mExtras != null) { if (mExtras == null) { mExtras = new Bundle(src.mExtras); } else { mExtras.putAll(src.mExtras); } } return this; }
归根结底都是通过Bundle来实现数据封装。而Bundle则是通过Map的数据结构来存储数据。
mMap = new HashMap<String, Object>();
mParcelledData
两者同时只有一个有效。
一旦unparcel以后,mParcelledData
的数据将被填充到mMap中,同时值为null。在writeToParcel和readFromParcel中则直接使用mParcelledData.此时一般通过IBinder关联两个进程的通信。
关于Bundle则是实现了Parcelable接口的类,通过上面提到的HashMap和一个Parcel来存储数据。
public final class Bundle implements Parcelable, Cloneable { private static final String LOG_TAG = "Bundle"; public static final Bundle EMPTY; static { EMPTY = new Bundle(); EMPTY.mMap = Collections.unmodifiableMap(new HashMap<String, Object>()); } // Invariant - exactly one of mMap / mParcelledData will be null // (except inside a call to unparcel) /* package */ Map<String, Object> mMap = null; /* * If mParcelledData is non-null, then mMap will be null and the * data are stored as a Parcel containing a Bundle. When the data * are unparcelled, mParcelledData willbe set to null. */ /* package */ Parcel mParcelledData = null;
public void putFloat(String key, float value) { unparcel();//首先解析出mParcelledData到mMap mMap.put(key, value); } /* package */ synchronized void unparcel() { if (mParcelledData == null) { return; } int N = mParcelledData.readInt(); if (N < 0) { return; } if (mMap == null) { mMap = new HashMap<String, Object>(); } mParcelledData.readMapInternal(mMap, N, mClassLoader); mParcelledData.recycle(); mParcelledData = null;//回收以后值为null }
相关文章推荐
- Android:Intent传递数据的几种类型和源码实现
- Android:Intent传递数据的几种类型和源码实现
- Android:Intent传递数据的几种类型和源码实现
- Android:Intent传递数据的几种类型和源码实现
- Android基础总结二:Intent总结二(Intent传递数据的几种类型)
- android之Intent复杂数据的传递(ArrayList<String>类型的数据)
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- Android:使用AIDL实现进程间传递复杂数据类型
- Android 使用Intent传递数据的实现思路与代码
- Android实现intent跳转界面传递数据(2)——onActivityResult方法接收返回值
- Android中Intent传递自定义对象类型的数据
- Android: 用Intent实现Activity之间数据传递
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- android基础学习6——intent实现数据传递
- Android进阶之路-Intent传递数据,数据回写,ActionBar菜单实现,销毁前数据保存,Intent意图(电话,网络)
- 【Android数据传递】Intent传递List和Object和List<Object>(附源码)
- Android学习——Intent传递复杂数据类型
- Android中Intent传递的四种数据类型以及传递方法
- android传递数据方式4--通过Intent实现Activity之间的数据传递
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数