首页

Intent传递对象

搜索

概述
Intent在不同的组件中传递对象数据的应用非常普遍。以下介绍两种通过Intent传递对象的方法。
1、第一种是通过实现Serializable接口,将类序列化。

2、第二种是实现Parcelizable接口。
为什么要将对象序列化?基于以下三点:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。


实现Serializable接口
概述
Serialize,译成串行化、序列化,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.
主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
Serializable的实现,只需要继承implements Serializable即可。这只是给对象打了一个标记
系统会自动将其序列化。

实现步骤
步骤1、自定义类实现Serializable接口。
说明:该接口是个空接口,没有任何方法需要实现。
示例:创建User类,该类实现了Serializable接口,代码如下:
public class User implements Serializable{
private static final long serialVersionUlD=1396394676190202496L;
private String mName;
private int mAge;
private String mPhone;
public static long getSerialversionuid(){
return serialVersionUID;
}
public User(String mName, int mAge, String mPhone){
super();
this.mName=mName;
this.mAge=mAge;
this.mPhone=mPhone;
}
public User(){}
@Override

public String toString(){
return "name:"+this.mName+"\n"+
"age=”+this.mAge+"\n"+
"phone=”+this.mPhone;
}
}
步骤2、创建测试的Activity-MainAct,在该类中启动第二个Activity-SecondAct,代码如下:
User user=new User( "zhang san" ,22," 13355778866");
Intent intent=newIntent(MainAct.this,SecondAct.class);
intent.putExtra("user", user);//将user对象保存在intent对象中。
步骤3、在SecondAct中接收MainAct传递过来的user对象。代码如下:
Intent intent=getIntent();
User user=(User)intent.getSerializableExtra("user");
实现Parcelable接口

概述
1、为什么要实现Parcelable接口来实现在Intent中传递对象?基于以下两点:
(1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。
(2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC
提示:
Parcelable不能使用在将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持
续性在外界有变化的情况下。因此这种情况下。建议使用Serializable方式。
2, Android中的新的序列化机制
在Android系统中,针对内存受限的移动设备,因此对性能要求更高,Android系统采用了新
的IPC(进程间通信)机制,要求使用性能更出色的对象传输方式。因此Parcel类被设计出来,其定位
就是轻量级的高效的对象序列化和反序列化机制。
Parcel的序列化、反序列化的读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储
器会高很多;
Parcel类
概述
就应用程序而言,最常使用Parcel类的场景就是在Activity间传递数据。在Activity间使用Intent
传递数据的时候,可以通过Parcelable机制传递复杂的对象。
Parcel机制:本质上把它当成一个Serialize就可以了,只是Parcel的对象是在内存中完成的序列
化和反序列化,利用的是连续的内存空间,因此更加高效。
常用方法
1, public final native XXX getXXX();
XXX-常用的有:String, int, char, double, float, CharSequence类型。
作用:从Parcel对象中读取数据。
示例:
Parcel source;
String name=source.getString();
2, public final native putXXX();
XXX-常用的有:String, int, char, double, float, CharSequence类型。
作用:将数据保存至Parcel对象中。
示例:
Parcel dest=new ParceI();
Dest.writeString(”李四”);
Parcelable接口
概述
Parcel类用作封装数据,封装后的数据可以通过Intent或IPC传递。除了基本类型以外,只有实
现了Parcelable接口的类才能被放入Parcel中。
常用方法
1, writeToParcel (Parcel dest, int flags);
作用:将对象的数据写入外部提供的Parcel对象中,声明如下:
参数-dest:数据保存的目标Parcel对象。
2, describeContents();
作用:返回int类型的值,该值用来表示包含在Parcelable中的当前对象,返回默认的值0即可。
3、静态的Parcelable.Creator接口,本接口有两个方法:
(1)createFromParcel(Parcel in);
作用:创建并返回自定义类的对象,该对象的数据从in对象中获取。
示例:
//重写createFromParce厉法,创建并返回一个获得了数据的user对象
@Override
public User createFromParcel(Parcel source){
return new User(source);
}
(2)newArray(int size);
作用:创建并返回类型为T,长度为size的对象数组,仅一句话(return new T[size])即可。本方
法供外部类反序列化本类数组使用。
示例:
//重写newArray方法,返回对象数组
@Override
public User[] newArray(int size){
return new User[size];
}
实现步骤
步骤1、自定义类,实现Parcelable接口,并重写该接口的两个方法,示例代码如下:
public class User implements Parcelable{
public String mName;//姓名属性
public int mAge;//年龄属性
public String mPhone;//电话号码属性
//无参构造方法,供外界创建类的实例时调用。
public User(){}
//带参构造方法私有化,本构造方法仅供类的方法createFromParcel调用。
private User(Parcel source){
mName=source.readString();
mAge=source.readInt();
mPhone=source.readString();
}
@Override
public int describeContents(){
//TODO Auto-generated method stub
return 0;
}
//将对象中的属性保存至目标对象dest中
@Override
publicvoidwriteToParcel(Parceldest, intflags){
dest.writeString(mName);
dest.writeInt(mAge);
dest.writeString(mPhone);
}
//重写toString方法,方便显示对象的数据
@Override
public String toString(){
return "name=”+mName+
"\nage=”+mAge+
"\nphone=”+mPhone;
}
}

步骤2、在以上的User类中添加一个常量CREATOR,该常量必须实现Parcelable接口的内部接口
Creator,并实现该接口中的两个方法:
1, Public Object createFromParceI();
作用:返回当前类的实例,构造参数为source
示例:return new User(source);
提示:User(source构造方法在步骤1中定义。
2, newArray()
作用:返回当前类型的数组
示例: return new User[size];
示例代码如下:
public class User implements Parcelable{
public String mName;//姓名属性
public int mAge;//年龄属性
public String mPhone;//电话号码属性
//无参构造方法,供外界创建类的实例时调用。
public User(){}
//带参构造方法私有化,本构造方法仅供类的方法createFromParcel调用。
private User(Parcel source){
mName=source.readString();
mAge=source.readInt();
mPhone=source.readString();
@Override
public int describeContents(){
//TODO Auto-generated method stub
return 0;
}
//将对象中的属性保存至目标对象dest中
@Override
public void writeToParcel(Parcel dest, intflags){
dest.writeString(mName);
dest.writeInt(mAge);
dest.writeString(mPhone);
}
//创建一个常量对象,该对象以内部匿名类的形式实现Parcelable.creator接口
public static final Parcelable.Creator<User> CREATOR=
new Parcelable.Creator<User>(){
//重写newArray方法,返回对象数组
@Override
public User[] newArray(int size){
return new User[size];
}
//重写createFromParcel方法,创建并返回一个获得了数据的user对象
@Override
public User createFromParcel(Parcel source){
return new User(source);
}

};

//重写toString方法,方便显示对象的数据
@Override
public String toString(){
return "name=”+mNamP+
"\nage=”+mAge+
"\nphone=”+mPhone;

}

}

步骤3、编写Activity类-MainAct,该类负责启动第二个Activity-SecondAct,并传递给SecondAct
User对象,示例代码如下:
//创建User对象,并赋值
User user=new User();
user.mName=”张兰兰”;
user.mAqe=23;
user.mPhone=”13697755886";
//将user保存在bundle对象中
Bundle bundle=new BundIe();
bundle.putParcelable("user", user);
Intent intent=newIntent();
intent.putExtras(bundle);//将bundle保存在intent中
intent.setClass(MainAct.this, SecondAct.class);
startActivity(intent);
步骤4、在SecondAct类中接收传递过来的user对象,示例代码如下:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
User user=bundle.getParcelable("user");


上一页 下一页