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中Intent传递对象的两种方法Serializable,Parcelable所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)