您的位置:首页 > 其它

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,实现里面的两个方法

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接口来传递对象的具体操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: