Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。
被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable
Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。
两种序列化方式的区别:
1.在使用内存的时候,Parcelable比Serializable性能高,推荐使用Parcelable类;
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下,
这种情况建议使用Serializable。
第一步:定义序列化实体类;
Serializable方式:
/** * PersonSer * * @author http://blog.csdn.net/zuolongsnail */ public class PersonSer implements Serializable { /** * serialVersionUID的作用是在修改实体类后,可以正常的序列化和反序列化,在此不多说,大家可以谷歌百度下。 */ private static final long serialVersionUID = -7620435178023928252L; 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; } }
Parcelable方式:
/** * PersonPar * * @author http://blog.csdn.net/zuolongsnail */ public class PersonPar implements Parcelable { 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; } /** * 序列化实体类 */ public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() { public PersonPar createFromParcel(Parcel source) { PersonPar personPar = new PersonPar(); personPar.name = source.readString(); personPar.age = source.readInt(); return personPar; } public PersonPar[] newArray(int size) { return new PersonPar[size]; } }; @Override public int describeContents() { return 0; } /** * 将实体类数据写入Parcel */ @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(name); parcel.writeInt(age); } }
第二步:传递序列化对象;
Intent intent = new Intent(MainActivity.this, DestActivity.class); Bundle bundle = new Bundle(); switch (v.getId()) { case R.id.serializable_btn: // Serializable传递对象 PersonSer personSer = new PersonSer(); personSer.setName("zuolong"); personSer.setAge(26); bundle.putSerializable(SER_KEY, personSer); intent.putExtra("type", SER_TYPE); intent.putExtras(bundle); startActivity(intent); break; case R.id.parcelable_btn: // Parcelable传递对象 PersonPar personPar = new PersonPar(); personPar.setName("snail"); personPar.setAge(27); // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以传递数组和列表 bundle.putParcelable(PAR_KEY, personPar); intent.putExtra("type", PAR_TYPE); // Intent也有putParcelableArrayListExtra方法,可以传递实现Parcelable接口的对象列表 intent.putExtras(bundle); startActivity(intent); break; }
第三步:获取对象;
StringBuffer sb = new StringBuffer(); String type = getIntent().getStringExtra("type"); // 根据type判断是哪种类型 if (type.equals(MainActivity.SER_TYPE)) { // 获取Serializable对象 PersonSer personSer = (PersonSer) getIntent().getSerializableExtra( MainActivity.SER_KEY); sb.append("----From Serializable----").append("\n"); sb.append("Name:").append(personSer.getName()).append("\n"); sb.append("Age:").append(personSer.getAge()).append("\n"); } else if (type.equals(MainActivity.PAR_TYPE)) { // 获取Parcelable对象 PersonPar personPar = (PersonPar) getIntent().getParcelableExtra( MainActivity.PAR_KEY); sb.append("----From Parcelable----").append("\n"); sb.append("Name:").append(personPar.getName()).append("\n"); sb.append("Age:").append(personPar.getAge()).append("\n"); }
运行结果截图:
附源码:源码下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
为什么bundle有、方法;但是只有方法?我是否只能传输一个元素的,而不是?那么,是用来干什么的?
本文向大家介绍Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法,包括了Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法的使用技巧和注意事项,需要的朋友参考一下 Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.pu
本文向大家介绍详解Android中Intent传递对象给Activity的方法,包括了详解Android中Intent传递对象给Activity的方法的使用技巧和注意事项,需要的朋友参考一下 Activity回顾 activity是android程序中最重要的组件之一,它是用户与android用户交互的主要组件,类似于桌面程序的图形界面。android程序大致可以分为看的见的组件和看不见的serv
本文向大家介绍Android开发中Intent传递对象的方法分析,包括了Android开发中Intent传递对象的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Android开发中Intent传递对象的方法。分享给大家供大家参考,具体如下: 方法一: 利用方法:public Intent putExtra (String name, Parcelable value)传递一个Pa
在我的代码中,我使用两种方法将数据传递给一个新的片段。或者我通过Bundle传递数据,或者有时编写setter来传递数据。 两个工作都很好,还没有问题。 但现在,我正在优化我的代码,同时考虑保存实例、方向更改或任何其他可能丢失数据的方式。 因此,在我心目中,确切的疑问是通过bundle发送的数据是否在定向更改/从后台恢复的片段默认情况下保持完整。或者在bundle的情况下也必须使用savedIns
问题内容: 是否可以通过Java通过引用传递对象 就像在C#中一样 问题答案: 不,这在Java中是不可能的。 在Java中,方法的所有参数均按值传递。注意非原始型的的变量,它们是对对象的引用,也由值来传递:在这种情况下, 参考 是 由值来传递 。请注意,按值传递引用与按引用传递不同。