使用Intent传递对象
2015-09-24 18:03
302 查看
1.Intent传递普通字符
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("string_data", "hello"); intent.putExtra("int_data", 100); startActivity(intent);
2.Intent获取普通字符
getIntent().getStringExtra("string_data"); getIntent().getIntExtra("int_data", 0);
putExtra()方法中所支持的数据类型是有限的,虽然常用的一些数据类型它都会支持,但是当你想去传递一些自定义对象的时候就会发现无从下手
3.Intent传递自定义对象
使用Intent来传递对象通常有两种实现方式,Serializable和Parcelable3.1 Serializable方式
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。序列化的对象:
public class Person implements Serializable{ ... }
3.1.1 Serializable方式传递对象
Person person = new Person(); person.setName("Tom"); person.setAge(20); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("person_data", person); startActivity(intent);
3.1.2 Serializable方式接收对象
Person person = (Person) getIntent().getSerializableExtra("person_data");
3.2 Parcelable方式
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。3.2.1 Parcelable的实现方式
public class Person 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; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); // 写出name dest.writeInt(age); // 写出age } public static final Parcelable.Creator<Person> CREATOR = new Parcelable. Creator<Person>() { @Override public Person createFromParcel(Parcel source) { Person person = new Person(); person.name = source.readString(); // 读取name person.age = source.readInt(); // 读取age return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; }
首先我们让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作为数组大小就可以了。
3.2.2 Parcelable方式传递对象
Person person = new Person(); person.setName("Tom"); person.setAge(20); Intent intent = new Intent(FirstActivity.this, SecondActivity.class); intent.putExtra("person_data", person); startActivity(intent);
3.2.2 Parcelable方式接收对象
Person person = (Person) getIntent().getParcelableExtra("person_data");
这样我们就把使用Intent来传递对象的两种实现方式都学习完了,对比一下,Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable方式低一些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现Intent传递对象的功能。
相关文章推荐
- tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项
- vim 函数列表插件
- 关于重叠io完成例程中的sleepEx()
- 字符导致的不便
- git 服务器搭建及一些命令说明
- 图片隐写
- getPropertyDescriptors()获取类的属性
- 解决MYSQL 中文乱码
- UI - UIImageViewAndSlider
- 晒淘宝网技术内幕
- 开始写博客啦
- 将其他js类库制作成seajs模块
- Run as ant build每次都执行两次-问题解决
- Git 常用命令大全
- 图像处理和计算机视觉中的经典论文
- TIME_WATI过多
- 潘鹏整理WPF(12)程序集资源
- Git 常用命令详解(二)
- QT程序发布提示driver not load
- 定时任务配置