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实现了ParcelableCloneable接口,当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