2014-05-18 2 views
12

Come dice il titolo, perché intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) o intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) non funziona?Perché FLAG_ACTIVITY_CLEAR_TOP non funziona?

Ho 3 Attività poniamo A, B e C.

Quando sto cercando di lanciare attività A da C con il codice:

Intent i = new Intent(this, A.class); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(i); 

Si inizia semplicemente Attività A, ma non lo fa cancellare la parte superiore.! -_-

Ho anche provato a utilizzare setFlags().

Ho letto diverse domande su SO su questo problema, ma non sono riuscito a trovare la risposta giusta. > _ <

Qualcuno per favore aiuto!

Modifica

Codice per onBackPressed() in attività di 'A' come richiesto da @codeMagic.

@Override 
public void onBackPressed(){ 
    if(wvLogin.canGoBack()) 
     wvLogin.goBack(); 
    else 
     super.onBackPressed(); 
} 
+0

Come non lo fa chiaro in cima? – codeMagic

+1

Cosa intendi come? Quando A viene lanciato, premendo il pulsante indietro, si deve uscire dall'app ma intean in questo caso, C viene messo a fuoco dallo sfondo. – ashu

+1

Questo è esattamente ciò che intendevo per "come". Dovevo solo assicurarmi che la tua definizione di come fosse la mia prima di esaminarla ulteriormente. – codeMagic

risposta

30

Dalla documentazione per FLAG_ACTIVITY_CLEAR_TOP:

Se impostato, e l'attività in fase di lancio è già in esecuzione nella corrente compito, allora invece di lanciare una nuova istanza di tale attività, tutti gli altri le attività su di esso saranno chiuse e questo Intenzione sarà consegnato al (ora in cima) vecchia attività come un nuovo intento .

Come aggiunto nel commento, l'attività A è terminata prima di chiamare B, quindi questa situazione non si applica. Verrà invece lanciata una nuova istanza di attività A.

come la vedo io, si hanno due opzioni qui:

1) utilizzare il Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK bandiere. Questo avvierà l'attività A come radice della pila. Funziona, ma tutte le altre attività nello stack andranno perse. Supponendo che A fosse la prima attività (o almeno, che non sei interessato a nessuna attività precedente nello stack delle attività), allora non importa. Nota: CLEAR_TASK richiede API Livello 11.

2) Un'altra possibile soluzione (nel caso l'ipotesi precedente non è vero) sarebbe non utilizzare flag di intento affatto:

  • B inizia con C startActivityForResult().
  • Invece di chiamare A, C termina, avendo impostato un risultato per B che indica che A deve essere lanciato.
  • In B.afterActivityResult(), finitura B e il lancio A.
+0

Un'altra opzione sarebbe quella di lasciare l'attività A nello stack (non chiamare finish() quando si lanciano altre attività). Ciò ti consentirà di utilizzare FLAG_ACTIVITY_CLEAR_TOP. Tuttavia, dovrai occuparti degli utenti BACKING nell'attività A. –

+0

e se avessi altre attività prima di A come in [questa domanda SO] (http://stackoverflow.com/questions/36111261/flag-activity-clear -top-does-not-work-as-expected), e ho dovuto conservarli nello stack? NEW_TASK fallisce lì, giusto? –

3

si è utilizzato un intento diferrent: utilizzare quella è stata inizializzata:

Intent i = new Intent(this, A.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\WRONG;; 
    startActivity(i); 

soluzione:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); \\RIGHT;; 

Si potrebbe o mettere un noHistory fedele al Activity A nel manifest

android:noHistory=true 
+0

sembra che ho commesso un errore di battitura in questione. Modifica ... – ashu

+1

@ashu aggiornato usa una noHistory –

+0

Perché impostare noHistory sull'attività 'A' quando funziona correttamente? Ho problemi con "B" e "C" poiché non sono finiti in background! – ashu

3

Ti manca la bandiera Intent.FLAG_ACTIVITY_SINGLE_TOP

Prova questa:

Intent i = new Intent(this, A.class); 
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(i);