Intent传递对象实现Parcelable接口和Serializable接口
2015-07-13 19:51
561 查看
我们都知道Intent是传递信息的介质,我们用他用的最多的就是从一个Activity转换到另一个Activity,并且顺带传递一些数据到下一个Activity中。但是如果我们传递过去的是一个包含很多信息的对象呢?这里就需要使用到Parcelable和Serializable这两个接口。
使用这两个接口的原因很简单,就是为了序列化对象!对象序列化有以下好处:
1.永久性保存对象,保存对象的字节序列到本地文件中
2.用过序列化对象在网络中传递对象
3.通过序列化对象在进程间传递对象
然后就是使用Parcelable接口的性能比Serializable的性能更好,而且Serizlizanble在对象序列化时会产生大量的临时变量,容易GC。推荐使用Parcelable接口。
首先上效果图:
然后就是代码了。
先是一个实例类,实现Parcelable接口,重写两个方法。然后就是添加一个常量CREATOR,并且实现内部接口Pracelable.Creator,实现里面的两个方法
然后就是MainActivity的代码了(这里注解的代码也是可以实现的,不需要bundle就直接传入Intent就可以传递对象。因为有这个方法Intent.putExtra(String name,Parcelable value)在,所以不用bundle也可以):
然后就是跳转接收的Activity的代码,都很简单,一看就懂
第二种方法就是实现Serializable接口(相对Parcelable更简单一点):
实体类(直接申明属性和实现接口就行了,是不是超简单):
跳转接收数据的Activity
以上就是实现Parcelable接口和Serializable接口来传递对象的具体操作。
使用这两个接口的原因很简单,就是为了序列化对象!对象序列化有以下好处:
1.永久性保存对象,保存对象的字节序列到本地文件中
2.用过序列化对象在网络中传递对象
3.通过序列化对象在进程间传递对象
然后就是使用Parcelable接口的性能比Serializable的性能更好,而且Serizlizanble在对象序列化时会产生大量的临时变量,容易GC。推荐使用Parcelable接口。
首先上效果图:
然后就是代码了。
先是一个实例类,实现Parcelable接口,重写两个方法。然后就是添加一个常量CREATOR,并且实现内部接口Pracelable.Creator,实现里面的两个方法
public class Person implements Parcelable { public int age;// 年龄 public String name;// 姓名 @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { // 返回对象数组大小 @Override b1ce public Person[] newArray(int size) { // TODO Auto-generated method stub return new Person[size]; } // 读取信息 @Override public Person createFromParcel(Parcel source) { // TODO Auto-generated method stub Person person = new Person(); person.age = source.readInt(); person.name = source.readString(); return person; } }; @Override public int describeContents() { // TODO Auto-generated method stub return 0; } // 写入信息 @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeInt(age); dest.writeString(name); } }
然后就是MainActivity的代码了(这里注解的代码也是可以实现的,不需要bundle就直接传入Intent就可以传递对象。因为有这个方法Intent.putExtra(String name,Parcelable value)在,所以不用bundle也可以):
button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, SecondActivity.class); // 携带对象参数 Person person = new Person(); person.age = 21; person.name = "sdf"; Bundle bundle = new Bundle(); bundle.putParcelable("person", person); // intent.putExtra("msg", person); intent.putExtras(bundle); startActivity(intent); } });
然后就是跳转接收的Activity的代码,都很简单,一看就懂
public class SecondActivity extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); textView = (TextView) findViewById(R.id.textview); Person person=new Person(); Intent intent=getIntent(); person=intent.getParcelableExtra("person"); textView.setText(person.toString()); }
第二种方法就是实现Serializable接口(相对Parcelable更简单一点):
实体类(直接申明属性和实现接口就行了,是不是超简单):
public class Book implements Serializable { private String name; private double peice; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPeice() { return peice; } public void setPeice(double peice) { this.peice = peice; } @Override public String toString() { return "Book [name=" + name + ", peice=" + peice + "]"; } }
跳转接收数据的Activity
public class ThridActivity extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_thrid); textView = (TextView) findViewById(R.id.textview); Book book = (Book) getIntent().getSerializableExtra("book"); textView.setText(book.toString()); }
以上就是实现Parcelable接口和Serializable接口来传递对象的具体操作。
相关文章推荐
- [Section 1.1] Greedy Gift Givers
- WordPress主题文件的执行顺序及其层次结构
- 数据库中触发器before与after认识
- Java集合之HashSet源码分析
- Spring IoC——ApplicationContext示例
- OC 基础之--- 多态,内存管理,@class和@ import
- jQuery获取input值、select值、select文本
- 01规划 最优比例生成树&最优比例环
- MyBatis知多少(6)表现层与业务逻辑层
- 防止远程密码拦截破译,ssh验证和普通用户登录
- 多重继承和虚继承的内存布局
- python 文件操作
- 栈应用 - 后缀表达式的计算
- Java调用MQ队列
- 栈应用 - 后缀表达式的计算
- 数据挖掘求职岗位要求分析
- NGUI ScrollView总结
- virtualenv and virtualenvwrapper on Ubuntu 14.04
- 基本数据结构之二叉树
- 关于rman duplicate 一些比较重要的知识点--系列三