2013-01-01 10 views
45

Ok, quindi sono un po 'perplesso su cosa fare con questo. Così ho MainActivity, e da lì un'attività può essere lanciata a DegreePlanActivity, e da lì un'altra attività può essere lanciata su EditDegreePlan. Ho EditDegreePlan impostato su noHistory in AndroidManifest. Il problema è che dopo aver salvato EditDegreePlan avvia un'attività su DegreePlan. Quindi, se l'utente preme Indietro, deve premere due volte per tornare a MainActivity. Voglio sbarazzarmene, quindi devono solo premerlo una volta. Sono perplesso su come farlo però.Android rimuovi l'attività dallo stack posteriore

Se si imposta DegreePlanActivity su noHistory, non è possibile premere Indietro su di esso in EditDegreePlan.

Ho provato a sovrascrivere il metodoBackPressed e a lanciare un intento su MainActivity. Il problema è che devono premere Indietro più volte per uscire dall'app.

Cosa devo fare?

+11

finitura write() dopo che il metodo startActivity –

risposta

95

FLAG_ACTIVITY_CLEAR_TOP chiaro il vostro stack di attività, è possibile utilizzare il codice:

Intent intent = new Intent(this, Activity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

Ricordate che questo flag cancella solo intermedi Attività, ad esempio, se si dispone di A, B, C nel vostro Back Stack poi andare da C Attività a D con questo flag questo non è chiaro Back Stack e lo Stack sarebbe A, B, C, D ma se si passa dall'Attività D all'Attività A con questo flag, le attività B, C, D si apriranno dallo stack e avrai solo A nel Back Stack.

+0

Grazie! Ha funzionato perfettamente.Sono stato anche in grado di rimuovere la noHistory da AndroidManifest. Semplicemente aggiungendo che una riga di codice per il metodo di salvataggio di EditDegreePlanActivity ha corretto tutto. – Emrys90

+0

come eseguire queste attività con taskAffinity = ""; ? – ralphgabb

+0

Wow, questa è una grande caratteristica. Non posso credere che funzioni e corrisponda esattamente alle mie esigenze. Ho un servizio asincrono in background che esegue la scansione dei codici a barre. E su specifici codici a barre inizia alcune attività. E in alcuni casi ho bisogno di rimuovere alcune attività avviate dallo stack. Questo funziona alla grande! –

6

Sembra che si otterrà il comportamento desiderato se non si specifica alcun contrassegno. Il pulsante indietro farebbe la cosa giusta. Per ottenere un'attività chiusa dal tuo codice usa il metodo finish() ha lo stesso effetto che l'utente preme il pulsante indietro. Quindi arriverete automaticamente a DegreePlan quando finirete EditDegreePlan, non c'è bisogno di chiamare nessuno Intents.

5

Ecco il vostro flusso:

MainActivity -> DegreePlanActivty -> EditDegreePlan -> DegreePlan -> MainActivty

ignorare queste metodo all'interno del vostro "DegreePlan"

public void onBackPressed() { 
    super.onBackPressed(); 
    Intent goToMainActivity = new Intent(getApplicationContext(), MainActivity.class); 
    goToMainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // Will clear out your activity history stack till now 
    startActivity(goToMainActivity); 
} 
7

I suggerire di utilizzare startActivityForResult(), anziché semplicemente startActivity(), quando si avvia EditDegreePlan-Activity, come descritto nello Android tutorials.

Nel EditDegreePlan-Activity quindi si chiama

setResult(RESULT_OK); 
finish(); 

Se non si prevede alcun dato dal EditDegreePlan-Activity, allora non devono necessariamente implementare l'onActivityResult.

+0

Incredibile idea! Il mio caso d'uso: una semplice attività di accesso (che potrebbe portare a un'attività di registrazione, senza interruzioni del flusso di utenti), una volta fatto il login, aprire un'attività di funzionalità. Se l'utente risponde, dovrebbe mostrare la mia prima attività (quella che ha attivato l'accesso). Risoluzione: le attività di accesso e registrazione sono ora chiamate con 'startActivityForResult'. Quando hanno finito, sono fuori dallo stack. Grazie! – danguilherme

6

soluzione semplice per API> = 15 per API 23 nome attività utente nell'intento.

Intent nextScreen = new Intent(currentActivity.this, MainActivity.class); 
nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(nextScreen); 
ActivityCompat.finishAffinity(currentActivity.this); 
+0

Fantastico! Thnx per qualcosa di attuale. – CelticParser

2

uso questo per cancellare lo stack:

menuIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
Problemi correlati