您的位置:首页 > 移动开发 > Android开发

android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)

2013-01-18 22:09 513 查看
第一、四大组件间数据传递方式:

启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。

其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:

putExtra和getExtra 其实是和Bundle put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量

所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。

所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。

Intent putExtra方法:

Intent putExtra(String name, Bundle value)

Intent putExtra(String name, Parcelable[] value)

Intent putExtra(String name, Serializable value)

Intent putExtra(String name, Parcelable value)

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)

Intent putExtras(Intent src)

Intent putExtras(Bundle extras)

Intent putIntegerArrayListExtra(String name, ArrayList<Integer> value)

Intent putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)

Intent putStringArrayListExtra(String name, ArrayList<String> value)

Intent getExtra方法:

double[] getDoubleArrayExtra(String name)

double getDoubleExtra(String name, double defaultValue)

Bundle getExtras()

int getFlags()

float[] getFloatArrayExtra(String name)

float getFloatExtra(String name, float defaultValue)

int[] getIntArrayExtra(String name)

int getIntExtra(String name, int defaultValue)

ArrayList<Integer> getIntegerArrayListExtra(String name)

long[] getLongArrayExtra(String name)

long getLongExtra(String name, long defaultValue)

Parcelable[] getParcelableArrayExtra(String name)

<T extends Parcelable> ArrayList<T> getParcelableArrayListExtra(String name)

<T extends Parcelable> T getParcelableExtra(String name)

Serializable getSerializableExtra(String name)

short[] getShortArrayExtra(String name)

short getShortExtra(String name, short defaultValue)

String[] getStringArrayExtra(String name)

ArrayList<String> getStringArrayListExtra(String name)

String getStringExtra(String name)

Intent 的mExtras对象:

private Bundle mExtras;

public Intent putExtra(String name, Parcelable value) {

if (mExtras == null) {

mExtras = new Bundle();

}

mExtras.putParcelable(name, value);

return this;

}

第二、自定义对象的传递:

通过intent 传递自定义对象的方法有两个,第一是实现Serialization接口,第二是实现Parcelable接口。

首选推荐Parceable,android中的很多数据类型都是实现Serialable接口方式来传递的,例如 Intent、Bundle、Bitmap、Uri等等。

android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel

Parcelable:一个规范接口,定义实现Parcelable需要实现的功能

Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。

Parcelable实现要点:需要实现三个东西

1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

2)describeContents方法。没搞懂有什么用,反正直接返回0也可以

3)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in) 实现从in中创建出类的实例的功能

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。

android doc示例代码:

publicclassMyParcelableimplementsParcelable{

private int mData;

public int describeContents(){

return 0;

}

public void writeToParcel(Parcelout,int flags){

out.writeInt(mData);

}public static final Parcelable.Creator<MyParcelable> CREATOR=newParcelable.Creator<MyParcelable>(){         

public MyParcelable createFromParcel(Parcelin){

return new MyParcelable(in);

}   

public MyParcelable[] newArray(int size){

return new MyParcelable[size];

}

};

private MyParcelable(Parcel in){

mData =in.readInt();

}

}

转:Serializable 和 Parcelable 区别http://www.blogjava.net/lincode/archive/2011/09/16/358805.html)
android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。


一 序列化原因:

1.永久性保存对象,保存对象的字节序列到本地文件中;

2.通过序列化对象在网络中传递对象;

3.通过序列化在进程间传递对象。

二 至于选取哪种可参考下面的原则:

1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。

2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

实现:

1 Serializable 的实现,只需要继承 implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。

2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐