第一行代码-13.2 使用Intent传递对象
2016-03-03 00:05
465 查看
使用Intent传递一般类型的数据比较简单,只要通过intent.putExtra(key, value)就可以实现,但是怎么传递自定义类型的数据,就需要使用一些技巧了。
1、Serializable方式
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
下面我们创建Student类,继承Serializable。
然后就可以用Intent.putExtra来插入Student对象了:
然后在SecondActivity中获取这个Student对象:
2、Parcelable方式
和Serializable方式不同在于,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。但是它的实现过程比较复杂,下面先创建Person类,并继承Parcelable接口。
Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了。
在SecondActivity中获取对象的方式差不多,如下:
总结:虽然序列化的方式比较简单,但是由于会将整个对象序列化,所以效率方面会比Parcelable方法低一些。所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。
1、Serializable方式
Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
下面我们创建Student类,继承Serializable。
public class Student implements Serializable{ private String name; private String number; public void setName(String name) { this.name = name; } public void setNumber(String number) { this.number = number; } public String getName() { return name; } public String getNumber() { return number; } }
然后就可以用Intent.putExtra来插入Student对象了:
mBSecondActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); Student student = new Student(); student.setName("Curry"); student.setNumber("30"); intent.putExtra("student_data", student); startActivity(intent); } });
然后在SecondActivity中获取这个Student对象:
Student student = (Student) getIntent().getSerializableExtra("student_data");
2、Parcelable方式
和Serializable方式不同在于,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。但是它的实现过程比较复杂,下面先创建Person类,并继承Parcelable接口。
public class Person implements Parcelable{ private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } public static final Creator<Person> CREATOR = new Creator<Person>() { @Override public Person createFromParcel(Parcel in) { Person person = new Person(); person.setName(in.readString()); person.setAge(in.readInt()); return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } }
Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了。
在SecondActivity中获取对象的方式差不多,如下:
Person person = (Person) getIntent().getParcelableExtra("person_data");
总结:虽然序列化的方式比较简单,但是由于会将整个对象序列化,所以效率方面会比Parcelable方法低一些。所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。
相关文章推荐
- C++上机报告(一)
- ASP.NET数据绑定GridView控件使用技巧
- python套接字流重定向实例汇总
- Python和Perl绘制中国北京跑步地图的方法
- Python中的数据对象持久化存储模块pickle的使用示例
- 举例简单讲解Python中的数据存储模块shelve的用法
- Python程序中用csv模块来操作csv文件的基本使用教程
- 浅析php设计模式之数据对象映射模式
- 简单介绍PHP非阻塞模式
- php编程每天必学之验证码
- php轻松实现文件上传功能
- PHP6新特性分析
- PHP的数组中提高元素查找与元素去重的效率的技巧解析
- 将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
- Java支持的数据类型有哪些?什么是自动拆装箱?
- spring RestTemplate用法详解
- spring异步线程的处理 @@Async介绍
- C++(学习笔记)二,基本数据类型所占字节大小
- python socket聊天
- spring代码笔记