7

Sto guardando un comportamento di Intent.FLAG_ACTIVITY_CLEAR_TOP.Flag Activity Clear Top distrugge l'attività target e creandola

Per esempio io ho tre attività A, B e C Ora Flow è A -> B -> C

Ora, quando sto iniziando A da C con questo flag con codice seguente.

Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent_to_a); 

per quanto ne so, Intent.FLAG_ACTIVITY_CLEAR_TOP dovrebbe rimuovere B e dovrebbe riprendere la A .E fa anche lo stesso, ma in un modo strano. Rimuove B, quindi rimuove A che crea A. Viene anche chiamato il metodo onDestroy di A. Qualcuno può dirmi è corretto o no? Se non voglio che venga distrutto cosa dovrei fare?

+2

sguardo FLAG_ACTIVITY_REORDER_TO_FRONT, questo è più vicino a ciò che si vuole http://developer.android.com/reference/android/content/Intent.html –

+1

sì, ho guardato in quel troppo, ma voglio anche a B distrutto, FLAG_ACTIVITY_REORDER_TO_FRONT metti solo A in ActivityStack senza rimuovere B. –

+1

potresti forse usare LocalBroadCastManager per inviare un intento separato a B per finire se stesso e quindi usare Reorder_to_front? Potrei fornire il codice sorgente se questo è qualcosa che ti interessa in –

risposta

3

Utilizzare FLAG_ACTIVITY_REORDER_TO_FRONT e quindi utilizzare un intento per dire a B di finire.

Attività B:

private BroadcastReceiver finishReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    }; 
public void onCreate() { 
LocalBroadcastManager.getInstance(this) 
       .registerReceiver(finishReceiver , 
         new IntentFilter("B-finish")); 
} 
public void onDestroy() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(
       finishReceiver); 
} 

Attività C:

LocalBroadcastManager.getInstance(this).sendBroadcast(
       new Intent("B-finish")); 
Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
       startActivity(intent_to_a); 
+0

Ehi, non trovo nessuna classe come LocalBroadcastManager nella mia attuale versione di Android, sto usando la versione 2.3.3 di Android, api livello 10. –

+0

è necessario aggiungere la libreria di supporto v4 http : //developer.android.com/tools/extras/support-library.html –

2

entrambi i casi,
. Modificare lo launchMode dell'attività A in qualcosa di diverso dallo standard (ad esempio singleTask o qualcosa). Allora la vostra bandiera FLAG_ACTIVITY_CLEAR_TOP non riavviare l'Attività A.

o,

. Usa Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP come bandiera. Allora funzionerà come desideri.

This question has good discussion on same topic
Android documentation dice -

L'istanza attualmente in esecuzione di attività B nell'esempio di cui sopra sarà o ricevere il nuovo intento si stanno iniziando qui nel suo metodo onNewIntent(), o essere in sé finito e riavviato con il nuovo intento.

Se ha dichiarato che la modalità di avvio è "multipla" (impostazione predefinita) e non hai impostato FLAG_ACTIVITY_SINGLE_TOP nello stesso intento, verrà completata e ricreata; per tutte le altre modalità di lancio o se è impostato FLAG_ACTIVITY_SINGLE_TOP, questo Intent verrà consegnato a onNewIntent() dell'istanza corrente.