Android中Intent传递对象的两种方法Serializable,Parcelable
Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。
Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。
二者的使用场景和区别:
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable。
Serializable接口实现比较简单,只要实现setter和getter,就可以了。
而Parcelable实现比较麻烦些。用一个小的demo来说明:
1.新建android项目ObjectTranDemo
2.创建一个entity的javaBean:Person.java.实现Serializable接口
packagecom.example.objecttrandemo;
importjava.io.Serializable;
publicclassPersonimplementsSerializable{
privatestaticfinallongserialVersionUID=-7060210544600464481L;
privateStringname;
privateintage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
}
3.创建主界面activity_main.xml:
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="androidobjecttrance" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Serializable" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Parcelable" /> </LinearLayout>
4.创建主activity。这个activity主要用来响应点击事件,和传递数据。ObjecttranDemo.java:
packagecom.example.objecttrandemo;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
publicclassObjectTranDemoextendsActivityimplementsOnClickListener{
privateButtonsButton,pButton;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViews();
}
//initialtheviews
publicvoidsetupViews(){
sButton=(Button)findViewById(R.id.button1);
pButton=(Button)findViewById(R.id.button2);
sButton.setOnClickListener(this);
pButton.setOnClickListener(this);
}
//Serializeableobjecttrance
publicvoidSerializeMethod(){
PersonmPerson=newPerson();
mPerson.setName("durant");
mPerson.setAge(25);
IntentmIntent=newIntent(this,ObjectTranDemo1.class);
BundlemBundle=newBundle();
mBundle.putSerializable("mPerson",mPerson);
mIntent.putExtras(mBundle);
startActivity(mIntent);
}
//Pacelableobjecttrance
publicvoidPacelableMethod(){
BookmBook=newBook();
mBook.setBookName("amanfrommars");
mBook.setAuthor("james");
mBook.setPublishTime(2014);
IntentmIntent=newIntent(this,ObjectTranDemo2.class);
BundlemBundle=newBundle();
mBundle.putParcelable("mBook",mBook);
mIntent.putExtras(mBundle);
startActivity(mIntent);
}
@Override
publicvoidonClick(Viewv){
if(v==sButton){
SerializeMethod();
}else{
PacelableMethod();
}
}
}
5.新建activityObjectTranDemo1.java用来显示Serializable接口传递过来的数据
packagecom.example.objecttrandemo;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassObjectTranDemo1extendsActivity{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
TextViewmTextView=newTextView(this);
PersonmPerson=(Person)getIntent().getSerializableExtra("mPerson");
mTextView.setText("Younameis:"+mPerson.getName()+"\n"+
"Youageis:"+mPerson.getAge());
setContentView(mTextView);
}
}
至此,Serializable接口传递数据完毕,对了,别忘了,在Mainfest.xml文件中声明新的activity
<?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.example.objecttrandemo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name="com.example.objecttrandemo.ObjectTranDemo" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activityandroid:name=".ObjectTranDemo1"></activity> <activityandroid:name=".ObjectTranDemo2"></activity> </application> </manifest>
下面看Parcelable的传递:
实现Parcelable一般需要4个步骤:
1)implementsParcelable
2)重写writeToParcel方法,将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从Parcel容器获取数据
3)重写describeContents方法,内容接口描述,默认返回0就可以
4)实例化静态内部对象CREATOR实现接口Parcelable.Creator
publicstaticfinalParcelable.Creator<T>CREATOR
注:其中publicstaticfinal一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcelin)实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,newArray(intsize)创建一个类型为T,长度为size的数组,仅一句话即可(returnnewT[size]),供外部类反序列化本类数组使用。
简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
具体:
1.新建Book的实体类:
Book.java:
packagecom.example.objecttrandemo;
importandroid.os.Parcel;
importandroid.os.Parcelable;
publicclassBookimplementsParcelable{
privateStringbookName;
privateStringauthor;
privateintpublishTime;
publicStringgetBookName(){
returnbookName;
}
publicvoidsetBookName(StringbookName){
this.bookName=bookName;
}
publicStringgetAuthor(){
returnauthor;
}
publicvoidsetAuthor(Stringauthor){
this.author=author;
}
publicintgetPublishTime(){
returnpublishTime;
}
publicvoidsetPublishTime(intpublishTime){
this.publishTime=publishTime;
}
//InternalDescriptionInterface,Youdonotneedtomanage
@Override
publicintdescribeContents(){
return0;
}
//givesomeattentiontotheoderbetwwenwriteToParcelandcreateFromParcel
@Override
publicvoidwriteToParcel(Parcelparcel,intflags){
parcel.writeString(bookName);
parcel.writeString(author);
parcel.writeInt(publishTime);
}
publicstaticfinalParcelable.Creator<Book>CREATOR=newCreator<Book>(){
@Override
publicBook[]newArray(intsize){
returnnewBook[size];
}
@Override
publicBookcreateFromParcel(Parcelsource){
BookmBook=newBook();
mBook.bookName=source.readString();
mBook.author=source.readString();
mBook.publishTime=source.readInt();
returnmBook;
}
};
}
2.新建activity:ObjectTranDemo2.java.用来显示parcelable的数据:
packagecom.example.objecttrandemo;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassObjectTranDemo2extendsActivity{
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
TextViewmTextView=newTextView(this);
BookmBook=(Book)getIntent().getParcelableExtra("mBook");
mTextView.setText("Booknameis:"+mBook.getBookName()+"\n"+
"Authoris:"+mBook.getAuthor()+"\n"+
"PublishTimeis:"+mBook.getPublishTime());
setContentView(mTextView);
}
}
在上篇文章给大家介绍了,Intent传递对象之Serializable和Parcelable的区别,感兴趣的朋友可以点击了解详情。