2012-08-07 10 views
5

Ho scritto una classe MyIntent che estende Intent. e quindi utilizzo un'istanza di MyIntent per richiamare startActivity (MyIntent).getIntent() e sottoclasse di Intent

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

il costruttore è:

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

tuttavia, quando chiamo getIntent() nella nuova attività iniziata il valore restituito di getIntent() è un Intent non myIntent, che è

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

quando provo (MyIntent) getIntent() il sistema mi lancia ClassCastException.How?

+0

Qual è il tuo obiettivo finale esattamente? Vuoi caricare una nuova pagina quando fai clic su un pulsante? oppure .. – corecase

risposta

5

Non è possibile farlo, poiché Intent implementa l'interfaccia Parcelable e Cloneable, viene ricreata quando l'oggetto intent si sposta tra i processi. Quindi sarà un'istanza diversa.

Nel source code of ActivityManagerProxy, startActivity Si noterà che l'intento non sarà passato per riferimento, ma è scritto in un pacco per creare un nuovo oggetto. Quindi l'oggetto Intento creato nella precedente attività non verrà più riferito.

+1

Se la sottoclasse di Intent non è possibile, come funziona LabeledIntent? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur

4

È possibile utilizzare il costruttore di copie per convertire l'intento "astratto" in uno più concreto. Pertanto è necessario scavalcare il costruttore di copie della classe Intent e chiamare semplicemente super.

dire che questo è il vostro intento:

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

È quindi possibile avviare questo intento della "attività di iniziatore" come questo:

... 

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

Nella "attività di destinazione" si potrebbe ottenere la Intent In questo modo:

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

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

Tecnicamente questo sembra essere un buon modo per abstra ct i dettagli del trasferimento dei dati tramite intenti. Tuttavia, potrebbe essere un problema di prestazioni copiare sempre l'intento.

Problemi correlati