利用Parcelable在Activity之间传输对象


在Android的不同Activity之间传输数据并不像传输参数那样简单。我们需要做的就是把需要传输的数据绑定到intent对象上。如果我们需要传输的对象是一些简单的Object,比如String类型或者Integer类型,那事情就好做了:

String strinParam = "String Parameter";
Integer intParam = 5;
 
Intent i = new Intent(this, MyActivity.class);
i.putExtra("uk.co.kraya.stringParam", stringParam);
i.putExtra("uk.co.kraya.intParam", intParam);
 
startActivity(i);

但是如果我们想要传输自定义的对象就有一点复杂了。你可以简单地将类序列化(Serializable),然后让Java来善后。但是使用序列化对于Android来说会产生严重的性能问题。解决办法即时使用Parcelable。


package uk.co.kraya.android.demos.Parcelable;
 
import android.os.Parcel;
import android.os.Parcelable;
 
/**
 * @author Shriram Shri Shrikumar
 *
 */
public class ObjectA implements Parcelable {
 
	private String strValue;
	private Integer intValue;
 
	/**
	 * 一个没有parcel参数的默认构造方法
	 * 
	 */
	public ObjectA() { ; };
 
	/**
	 *
	 * 当我们利用parcel重建对象时需要这个构造方法
	 * 
	 *
	 * @param in 读取这个对象的Parcel
	 */
	public ObjectA(Parcel in) {
		readFromParcel(in);
	}
 
	/**
	 * getter
	 *
	 * @return strValue
	 */
	public String getStrValue() {
		return strValue;
	}
 
	/**
	 * setter
	 *
	 * @param strValue
	 */
	public void setStrValue(String strValue) {
		this.strValue = strValue;
	}
 
	/**
	 * getter
	 *
	 * @return
	 */
	public Integer getIntValue() {
		return intValue;
	}
 
	/**
	 * setter
	 *
	 * @param intValue
	 */
	public void setIntValue(Integer intValue) {
		this.intValue = intValue;
	}
 
	@Override
	public int describeContents() {
		return 0;
	}
 
	@Override
	public void writeToParcel(Parcel dest, int flags) {
 
		// 我们只需把每个字段写入parcel
		// 然后按写入的顺序读取出来 
		dest.writeString(strValue);
		dest.writeInt(intValue);
	}
 
	/**
	 *
	 * 构造方法会调用该方法,利用parcel为字段赋值
	 * 
	 *
	 * @param in 重构对象的parcel
	 */
	private void readFromParcel(Parcel in) {
 
                //我们以parcel写入的相同顺序读取对象
		strValue = in.readString();
		intValue = in.readInt();
	}
 
    /**
     *
     * 需要利用这个字段创建新的对象
     * 要么以单个对象的形式,要么以数组的形式
     *
     *
     * 
     * 这意味着你能使用默认构造方法创建对象或者使用其它构造方法
     */
    public static final Parcelable.Creator CREATOR =
    	new Parcelable.Creator() {
            public ObjectA createFromParcel(Parcel in) {
                return new ObjectA(in);
            }
 
            public ObjectA[] newArray(int size) {
                return new ObjectA[size];
            }
        };
 
}

上面的例子中有一个自定义类ObjectA,它实现了Parcelable,类里有两个字段,分别是int,String类型。考虑一种特殊情况,如果你的自定义类里引用了另外一个类。很明显,它们都必须实现Parcelable,但是要怎样集成它们呢?ObjectB向我们展示了一个实现了Parcelable的类里嵌套另一个实现了Parcelable的自定义类。


package uk.co.kraya.android.demos.Parcelable;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class ObjectB implements Parcelable {
 
	private ObjectA obj;
	private Long longVal;
 
	public ObjectB() { ; }
 
	public ObjectA getObj() {
		return obj;
	}
 
	public ObjectB(Parcel in) {
		readFromParcel(in);
	}
 
	public void setObj(ObjectA obj) {
		this.obj = obj;
	}
 
	public Long getLongVal() {
		return longVal;
	}
 
	public void setLongVal(Long longVal) {
		this.longVal = longVal;
	}
 
	@Override
	public int describeContents() {
		return 0;
	}
 
	@Override
	public void writeToParcel(Parcel dest, int flags) {
 
		// writeParcelable方法需要一个flags,但是很简单
		dest.writeParcelable(obj, flags);
 
		// 和ObjectA一样
		dest.writeLong(longVal);
	}
 
	private void readFromParcel(Parcel in) {
 
		// readParcelable needs the ClassLoader readParcelable方法需要类加载器
		// 类加载器能够从指定类得到
		obj = in.readParcelable(ObjectA.class.getClassLoader());
 
		// 和ObjectA一样
		longVal = in.readLong();
	}
 
    public static final Parcelable.Creator CREATOR =
    	new Parcelable.Creator() {
            public ObjectB createFromParcel(Parcel in) {
                return new ObjectB(in);
            }
 
            public ObjectB[] newArray(int size) {
                return new ObjectB[size];
            }
        };
}

当我们在写Parcel时,我们需要向它传flags参数(非常简单)。当我们读取Parcel时,我们需要一个类加载器(classloader),这个类加载器能够从实现Parcelable的母的类获取(还是很简单吧)


最后,我们是这样传输parcelable对象的。


ObjectA obj = new ObjectA();
 
// Set values etc.
 
Intent i = new Intent(this, MyActivity.class);
i.putExtra("com.package.ObjectA", obj);
 
startActivity(i);

是不是很简单,对吧?

接下来是读取parcelable对象。

public class MyActivity extends Activity {
 
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		Bundle b = getIntent().getExtras();
		ObjectA obj =
			b.getParcelable("com.package.ObjectA");
	}
 
}

当然,如果它真的真的太容易了,那。。我们就失业了。。


Over...

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值