getIntent()和Intent的子类

时间:2012-08-07 01:40:54

标签: android

我写了一个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。如此?

2 个答案:

答案 0 :(得分:5)

你无法做到这一点,因为Intent实现了ParcelableCloneable接口,当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());
}
...

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