关于android Intent意图的一点心得
Intent 意图,android里通过它实现activity的指定跳转,一般可以通过它来传递某些参数给跳转到activity。
但是这中间也会出现一些问题,我以前没有注意到,最近在做项目的过程中才发现到这几点:
首先,intent 跳转所能携带的参数类型并不是没有限制的,无法让其传递一个object类型的对象。
那么我们希望通过其来传递一些类似自定义Vo对象时该怎么做呢?其实也很简单,Intent在传递对象时其实也是通过io流的方式进行的,而在处理对象流时需要对对象进行序列化,Intent也一样,想要通过其传递某些特定对象时我们只需要将该对象进行序列化,并在传过去之后对其反序列化即可。听着麻烦,结合SDK来看,其实通过有两种简单的方式就能够完成想过功能。
第一种,实现Serializable接口,这种方式在java jsk里就有,实现该接口就能够自动地对该类对象在传输时进行序列化和反序列化。
第二种,实现Parcelable接口,这个方式是androidapi1开始就提供的,效率上来说比Serializable要高一些,但是实现起来要稍微麻烦点,需要覆写一些方法:
1 public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } }
两种方式皆可实现目的,效率上后者更高一点,自己选择吧。
其次,是关于不同启动模式下,intent获取的问题。之前我一种直接通过getIntent()方法来获取执行跳转动作的activity传递过来的意图,但是后来由于项目内很多activity都采用了singletask的启动模式,而这种模式下某一activity永远只存在一个实例,这就会出现不同页面多次跳转到这个activity的情况,在这种模式下,我发现通过getIntent()方式获取到的永远是第一次跳转到该activity时候传过来的Intent。那到底该如何来获取后面几次穿过来的Intent呢?其实也很简单,只需要覆写activity内的OnNewIntent(Intent intent)方法就可以了,形参里的intent就是某次跳转过来时新Intent。