Andorid学习之路(七)之 Serializable接口和Parcelable接口

Activity之间的数据传输

activity之间的数据传输我们可以通过Intent对象的putExtra方法,通过这个可以传输很多不同类型的数据,比如说字符串、整数、实数、对象等。

首先以一个字符串举例来说一下:

通过putExtra传输字符串可以通过如下方法:

putExtra(String name, String value):intent

第一个参数为用来让接收数据的activity辨别的字符串,相当于HashMap中的索引值。

第二个为要发送的数据(这里是字符串)。

在目标activity中通过这个name来找到这个value。

当前activity中:

String str = "你好";
intent.putExtra("data", str);

目标activity中:

Bundle bundle = getIntent().getExtras();
String str = bundle.getString("data");

上面只是简单的说明一下如何传输字符串。

那么如何传输对象呢?这货比较特殊,不能像putExtra("data", Object)这样进行传输,没有这种方法。

在重载方法中可以找到两个比较特殊的方法:

putExtra(String name, Serializable value):intent

putExtra(String name, Parcelable value):intent

Serializable和Parcelable分别是两个接口,那么要传输对象,则只需要使得类实现这两个接口之一就行了。

我们先来看一下Serializable实现,创建一个类Obj并且实现该接口:

import java.io.Serializable;

public class Obj implements Serializable{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

当前activity:

Obj obj = new Obj();
obj.setName("李刚");
intent.putExtra("data", obj);

目标activity:

Bundle bundle = getIntent().getExtras();
Obj obj = (Obj) bundle.get("data");
String name = obj.getName();

再来看一下Parcelable实现,创建一个类Obj2并且实现该接口:

import android.os.Parcel;
import android.os.Parcelable;

public class Obj2 implements Parcelable{

	private String name;
	private String age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}
	
	@Override
	public int describeContents() {
		return 0;
	}

	/*
	 * 创建CREATOR常量(必须要这样做)
	 * */
	public static Parcelable.Creator<Obj2> CREATOR = new Creator<Obj2>() {
		
		@Override
		public Obj2[] newArray(int size) {
			return null;
		}
		
		/*
		 * 重写createFromParcel方法
		 * */
		@Override
		public Obj2 createFromParcel(Parcel source) {
			//通过读取Parcel类对象的属性,来set当前类的属性
			Obj2 obj2 = new Obj2();
			obj2.setName(source.readString());
			obj2.setAge(source.readString());
			return obj2;
		}
	};
	
	/*将对象属性保存到Parcel类对象中*/
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeString(name);
		dest.writeString(age);
	}
}

看起来是不是要比实现Serializable接口要复杂的多?但是这种方法要好多的,主要是该方法速度快,性能好(一般用这种)。

当前activity:

Obj2 obj2 = new Obj2();
obj2.setName("李刚");
obj2.setAge("38岁");
intent.putExtra("s1", obj2);

目标activity:

Bundle bundle = getIntent().getExtras();
Obj2 obj2 = (Obj2) bundle.get("s1");
String name = obj2.getName();
String age = obj2.getAge();

以上就是两种实现对象传输的方法。


THE END~



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章