Intent传递对象实现Parcelable接口和Serializable接口

我们都知道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
		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接口来传递对象的具体操作。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值