2012-08-07 46 views
5

我写了一个类MyIntent,它扩展了Intent。 然后我使用MyIntent的实例来调用startActivity(MyIntent)。getIntent()和意图的子类

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()的返回值是一个意图不MyIntent,就是

getIntent() instanceof Intent // true; 
getIntent() instanceof MyIntent // false; 

当我尝试(MyIntent)getIntent()系统抛出ClassCastException.How是这样吗?

+0

你的最终目标究竟是什么?你想要一个新的页面加载,当你点击一个按钮?或.. – corecase 2012-08-07 01:56:42

回答

5

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

source code of ActivityManagerProxy, startActivity 你会注意到intent不会被引用传递,而是被写入parcel来创建一个新的对象。因此,先前活动中创建的Intent对象将不再被引用。

+1

如果子类化Intent不可行LabeledIntent然后如何工作? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur 2014-03-16 06:38:34

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()); 
} 
... 

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