5

我写了一个扩展 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。怎么会这样?

4

2 回答 2

5

你不能这样做,因为 Intent 实现ParcelableCloneable接口,它会在 Intent 对象跨进程移动时重新创建。因此,这将是一个不同的例子。

ActivityManagerProxy的源码中, startActivity 你会注意到intent不会通过引用传递,而是写入一个Parcel来创建一个新的对象。所以在之前的Activity中创建的Intent对象将不再被引用。

于 2012-08-07T02:16:25.303 回答
4

您可以使用复制构造函数将您的“抽象”意图转换为更具体的意图。因此,您需要重写该类的复制构造函数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());
}
...

从技术上讲,这似乎是一种通过意图抽象数据传输细节的好方法。但是,总是复制意图可能是一个性能问题。

于 2013-08-25T08:39:58.410 回答