2012-08-07 35 views
5

Escribí una clase MyIntent que amplía el Intento. y luego uso una instancia de MyIntent para invocar startActivity (MyIntent).getIntent() y la subclase de Intento

MyIntent i=new MyIntent(this,NewActivity.class); 

el constructor es:

public MyIntent(Context context,Class<?> cls){ 
super(context,cls); 
putExtra(var1,var2); 
//other codes 
((Activity)context).startActivity(this); 
} 

Sin embargo, cuando llamo getIntent() en la nueva actividad comenzó el valor devuelto de getIntent() es un Intento no myIntent, que es

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

cuando intento (MyIntent) getIntent() el sistema me lanza ClassCastException.¿Cómo es?

+0

¿Cuál es su objetivo final exactamente? ¿Desea cargar una página nueva cuando hace clic en un botón? o .. – corecase

Respuesta

5

No se puede hacer eso, ya que Intent implementa las interfaces Parcelable y Cloneable, se vuelve a crear cuando el objeto de intención se mueve a través de los procesos. Por lo tanto, será una instancia diferente.

En el source code of ActivityManagerProxy, startActivity Observará que el intento no se pasará por referencia, sino que está escrito en un paquete para crear un nuevo objeto. Por lo tanto, el objeto de intención creado en la actividad anterior ya no será referido.

+1

Si no es posible la creación de subclases de intención, ¿cómo funciona LabeledIntent? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur

4

Puede usar el constructor de copias para convertir su intención "abstracta" en una más concreta. Por lo tanto, necesitaría anular el constructor de copia de la clase Intent y simplemente llamar a super.

decir esto es su intención:

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) 
    } 
} 

A continuación, puede iniciar esta intención de la "actividad iniciador" de esta manera:

... 

public void someLogicInTheInitiatingActivity() { 
    startActivity(new StronglyTypedIntent(this, "some information")); 
} 
...  

En la "actividad de destino" se podía conseguir la Intent como este:

... 
public void someLogicInTheTargetActivity() { 
    StronglyTypedIntent intent = new StronglyTypedIntent(getIntent()); 

    doSomethingWithTheInformation(intent.getSomeInformation()); 
} 
... 

Técnicamente esto parece ser una buena manera de abstra ct los detalles de la transferencia de datos a través de intents. Sin embargo, podría ser un problema de rendimiento copiar siempre el intento.

Cuestiones relacionadas