getIntent()和Intent的子类
我写了一个扩展Intent的MyIntent类。 然后我使用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.How是如此?
你不能那样做,因为Intent实现了Parcelable
和Cloneable
接口,当intent对象跨进程移动时,它会被重新创建。 因此它将是一个不同的例子。
在ActivityManagerProxy的源代码中,startActivity你会注意到intent不会被引用传递,而是被写入一个Parcel来创建一个新的对象。 因此,先前活动中创建的Intent对象将不再被引用。
您可以使用复制构造函数将“抽象”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());
}
...
从技术上讲,这似乎是通过意图来抽象数据传输细节的好方法。 但是,总是复制意图可能是性能问题。
链接地址: http://www.djcxy.com/p/67899.html上一篇: getIntent() and subclass of Intent
下一篇: LinkedList put into Intent extra gets recast to ArrayList when retrieving in next activity