当前位置: 移动技术网 > IT编程>移动开发>Android > Android中Intent传递对象的两种方法Serializable,Parcelable

Android中Intent传递对象的两种方法Serializable,Parcelable

2019年07月24日  | 移动技术网IT编程  | 我要评论

人工智能图普 科技,求爱威龙,偷香窃明

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接口

package com.example.objecttrandemo; 
import java.io.serializable; 
public class person implements serializable { 
private static final long serialversionuid = -7060210544600464481l; 
private string name; 
private int age; 
public string getname() { 
return name; 
} 
public void setname(string name) { 
this.name = name; 
} 
public int getage() { 
return age; 
} 
public void setage(int age) { 
this.age = age; 
} 
}

3.创建主界面activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<linearlayout xmlns: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="android object trance" 
/> 
<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:

package com.example.objecttrandemo; 
import android.app.activity; 
import android.content.intent; 
import android.os.bundle; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.button; 
public class objecttrandemo extends activity implements onclicklistener{ 
private button sbutton,pbutton; 
@override 
protected void oncreate(bundle savedinstancestate) { 
super.oncreate(savedinstancestate); 
setcontentview(r.layout.activity_main); 
setupviews(); 
} 
//initial the views 
public void setupviews(){ 
sbutton = (button)findviewbyid(r.id.button1); 
pbutton = (button)findviewbyid(r.id.button2); 
sbutton.setonclicklistener(this); 
pbutton.setonclicklistener(this); 
} 
//serializeable object trance 
public void serializemethod(){ 
person mperson = new person(); 
mperson.setname("durant"); 
mperson.setage(25); 
intent mintent = new intent(this,objecttrandemo1.class); 
bundle mbundle = new bundle(); 
mbundle.putserializable("mperson",mperson); 
mintent.putextras(mbundle); 
startactivity(mintent); 
} 
//pacelable object trance 
public void pacelablemethod(){ 
book mbook = new book(); 
mbook.setbookname("a man from mars"); 
mbook.setauthor("james"); 
mbook.setpublishtime(2014); 
intent mintent = new intent(this,objecttrandemo2.class); 
bundle mbundle = new bundle(); 
mbundle.putparcelable("mbook", mbook); 
mintent.putextras(mbundle); 
startactivity(mintent); 
} 
@override 
public void onclick(view v) { 
if(v == sbutton){ 
serializemethod(); 
}else{ 
pacelablemethod(); 
} 
} 
}

5.新建activity objecttrandemo1.java用来显示serializable接口传递过来的数据

package com.example.objecttrandemo; 
import android.app.activity; 
import android.os.bundle; 
import android.widget.textview; 
public class objecttrandemo1 extends activity{ 
@override 
public void oncreate(bundle savedinstancestate) { 
super.oncreate(savedinstancestate); 
textview mtextview = new textview(this); 
person mperson = (person)getintent().getserializableextra("mperson"); 
mtextview.settext("you name is: " + mperson.getname() + "\n"+ 
"you age is: " + mperson.getage()); 
setcontentview(mtextview); 
} 
}

至此,serializable接口传递数据完毕,对了,别忘了,在mainfest.xml文件中声明新的activity

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns: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> 
<action android:name="android.intent.action.main" /> 
<category android:name="android.intent.category.launcher" /> 
</intent-filter> 
</activity> 
<activity android:name=".objecttrandemo1"></activity> 
<activity android:name=".objecttrandemo2"></activity> 
</application> 
</manifest>

下面看parcelable的传递:

实现parcelable一般需要4个步骤:

1)implements parcelable

2)重写writetoparcel方法,将你的对象序列化为一个parcel对象,即:将类的数据写入外部提供的parcel中,打包需要传递的数据到parcel容器保存,以便从 parcel容器获取数据

3)重写describecontents方法,内容接口描述,默认返回0就可以

4)实例化静态内部对象creator实现接口parcelable.creator

public static final parcelable.creator<t> creator

注:其中public static final一个都不能少,内部对象creator的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createfromparcel(parcel in) 实现从parcel容器中读取传递数据值,封装成parcelable对象返回逻辑层,newarray(int size) 创建一个类型为t,长度为size的数组,仅一句话即可(return new t[size]),供外部类反序列化本类数组使用。

简而言之:通过writetoparcel将你的对象映射成parcel对象,再通过createfromparcel将parcel对象映射成你的对象。也可以将parcel看成是一个流,通过writetoparcel把对象写到流里面,在通过createfromparcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。

具体:

1.新建book的实体类:

book.java:

package com.example.objecttrandemo; 
import android.os.parcel; 
import android.os.parcelable; 
public class book implements parcelable{ 
private string bookname; 
private string author; 
private int publishtime; 
public string getbookname() { 
return bookname; 
} 
public void setbookname(string bookname) { 
this.bookname = bookname; 
} 
public string getauthor() { 
return author; 
} 
public void setauthor(string author) { 
this.author = author; 
} 
public int getpublishtime() { 
return publishtime; 
} 
public void setpublishtime(int publishtime) { 
this.publishtime = publishtime; 
} 
//internal description interface,you do not need to manage 
@override 
public int describecontents() { 
return 0; 
} 
//give some attention to the oder betwwen writetoparcel and createfromparcel 
@override 
public void writetoparcel(parcel parcel, int flags){ 
parcel.writestring(bookname); 
parcel.writestring(author); 
parcel.writeint(publishtime); 
} 
public static final parcelable.creator<book> creator = new creator<book>() { 
@override 
public book[] newarray(int size) { 
return new book[size]; 
} 
@override 
public book createfromparcel(parcel source) { 
book mbook = new book(); 
mbook.bookname = source.readstring(); 
mbook.author = source.readstring(); 
mbook.publishtime = source.readint(); 
return mbook; 
} 
}; 
}

2.新建activity :objecttrandemo2.java.用来显示parcelable的数据:

package com.example.objecttrandemo; 
import android.app.activity; 
import android.os.bundle; 
import android.widget.textview; 
public class objecttrandemo2 extends activity{ 
public void oncreate(bundle savedinstancestate) { 
super.oncreate(savedinstancestate); 
textview mtextview = new textview(this); 
book mbook = (book)getintent().getparcelableextra("mbook"); 
mtextview.settext("book name is: " + mbook.getbookname()+"\n"+ 
"author is: " + mbook.getauthor() + "\n" + 
"publishtime is: " + mbook.getpublishtime()); 
setcontentview(mtextview); 
} 
}

在上篇文章给大家介绍了,intent传递对象之serializable和parcelable的区别,感兴趣的朋友可以点击了解详情。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网