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接口
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的区别,感兴趣的朋友可以点击了解详情。
推荐阅读
-
Android中Intent传递对象的两种方法Serializable,Parcelable
-
Android中传递对象的三种方法的实现
-
Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法
-
Android编程使用Intent传递对象的方法分析
-
Android中传递对象的三种方法的实现
-
Android编程实现全局获取Context及使用Intent传递对象的方法详解
-
Android系列之Intent传递对象的几种实例方法
-
Android编程实现全局获取Context及使用Intent传递对象的方法详解
-
Android系列之Intent传递对象的几种实例方法
-
android中intent传递list或者对象的方法