我写了一个MyIntent类,它扩展了Intent。 然后我使用MyIntent的一个实例来调用startActivity(MyIntent)。
MyIntent i=new MyIntent(this,NewActivity.class);
构造函数是:
public MyIntent(Context context,Class<?> cls){
super(context,cls);
putExtra(var1,var2);
//other codes
((Activity)context).startActivity(this);
}
但是,当我在新启动的活动中调用getIntent()时,getIntent()的返回值是Intent而不是MyIntent,即
getIntent() instanceof Intent // true;
getIntent() instanceof MyIntent // false;
当我尝试(MyIntent)getIntent()时,系统会抛出ClassCastException。如此?
答案 0 :(得分:5)
你无法做到这一点,因为Intent实现了Parcelable
和Cloneable
接口,当intent对象在进程间移动时会重新创建它。因此,它将是一个不同的实例。
source code of ActivityManagerProxy, startActivity 您将注意到intent不会通过引用传递,而是将其写入Parcel以创建新对象。因此,将不再引用先前Activity中创建的Intent对象。
答案 1 :(得分:4)
您可以使用复制构造函数将“抽象”Intent转换为更具体的Intent。因此,您需要覆盖Intent
类的复制构造函数,只需调用super。
说这是你的意图:
public class StronglyTypedIntent extends Intent {
private final static String ID = "verySecret";
public StronglyTypedIntent(final Activity initiator, final String someInformation) {
super(initiator, SomeTargetActivity.class);
putExtra(ID, someInformation);
}
public StronglyTypedIntent(final Intent original) {
super(original);
}
public String getSomeInformation() {
return getStringExtra(ID)
}
}
然后,您可以从“发起人活动”中启动此意图,如下所示:
...
public void someLogicInTheInitiatingActivity() {
startActivity(new StronglyTypedIntent(this, "some information"));
}
...
在“目标活动”中,您可以获得Intent
,如下所示:
...
public void someLogicInTheTargetActivity() {
StronglyTypedIntent intent = new StronglyTypedIntent(getIntent());
doSomethingWithTheInformation(intent.getSomeInformation());
}
...
从技术上讲,这似乎是通过意图抽象数据传输细节的好方法。 但是,始终复制意图可能是性能问题。