Android: apri l'attività senza salvarla nello stack


94

Ho 2 attività: Principale ed Elenco.

Da Main puoi aprire List; da List è possibile aprire Main.

Mi piacerebbe che ogni apertura di List non venga salvata nella "cronologia". Quindi, premendo indietro da Principale non è possibile tornare a Elenco.

È possibile?


11
Se "list" inizia "main", chiamalo finish()subito dopo startActivity(...). In questo modo se l'utente preme INDIETRO da "principale" non ci sarà nulla a cui tornare.
Squonk

questo è per la navigazione delle notifiche, ma i concetti potrebbero essere applicabili developer.android.com/guide/topics/ui/notifiers/…
Kevin Lee,

Risposte:


159

Quando inizi la tua lista Activity, imposta i suoi Intentflag in questo modo:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

Il FLAG_ACTIVITY_NO_HISTORYflag impedisce che il nuovo Activityvenga aggiunto allo stack della cronologia.

NB: Come @ Sam fa notare, è possibile utilizzare i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);invece. Non c'è differenza funzionale.


2
Solo un piccolo commento su questo metodo: questo funzionerà perfettamente se ci sono solo 2 attività. Ma se l'attività dell'elenco è in grado di avviare un'altra attività (diciamo la terza attività), una pressione sul pulsante Indietro nella terza attività tornerà all'attività principale e non all'attività dell'elenco
VinceFR

Infatti. Sfortunatamente, non c'è modo di evitarlo. Non esiste una Intentbandiera che affermi "solo aggiunge alla storia se non torna Activityall'origine".
Eric,

1
no ma il flag FLAG_ACTIVITY_NEW_TASK farà il lavoro, l'elenco delle attività verrà aggiunto alla cronologia ma sempre in alto, quindi una pressione all'indietro dall'attività principale non mostrerà l'elenco delle attività
VinceFR

7
C'è qualche motivo particolare con cui hai usato setFlags()al getFlags()posto di Intent.addFlags()?
Sam

1
@VinceFR è esattamente quello che voglio! a -> b ->
ce

90

Nel file manifest aggiungi:

android:noHistory="true" 

all'attività che non vuoi tenere in pila.


c'è qualche differenza dall'avvio di attività con flag no_history?
realtebo

1
Come hai detto nella tua domanda "ogni apertura della lista NON viene salvata nella 'cronologia'" Quindi ogni volta che apri di nuovo la tua applicazione ti porterà all'attività principale
Marcin S.

@ MarcinS. quando l'app non è nell'elenco delle app recenti non funziona. Puoi spiegarci perché sta succedendo
Ajit Kumar Dubey il

1
Allora qual è la differenza tra questi 2 approcci (manifest e flag)?
pumbosha

L'approccio di @pumbosha Manifest lascerà sempre l'attività fuori dalla cronologia. L'approccio flag consente di controllare tale comportamento in fase di esecuzione.
John Crawford,

27

Usa la nuova attività con la cancellazione. Questo ha funzionato nel mio caso quando le altre opzioni non funzionavano.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Cancella l'intero stack della cronologia e avvia una nuova attività su Android


1
Sarebbe fantastico, ma c'è un modo per fermare l'ampia animazione del sistema "cambiando attività"? L'aggiunta di FLAG_ACTIVITY_NO_ANIMATION non lo impedisce, purtroppo!
androidguy

questo influisce sulla velocità dell'applicazione?
Acauã Pitta

23

Sembra che se chiami finish () sulla tua attività subito dopo averne aperto un altro, quello che è finito viene rimosso dallo stack.

per esempio:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

Se il tuo telefono non è così veloce, vedrai che l'attività precedente si sta spostando.
Nolan

@Nolan è solo se finisci prima di iniziare l'attività
Henrik Bøgelund Lavstsen

7

Nel mio caso particolare FLAG_ACTIVITY_NO_HISTORYnon ha funzionato. Né funzionavano FLAG_ACTIVITY_NEW_TASKo funzionavano FLAG_ACTIVITY_CLEAR_TASKda soli.

Tuttavia FLAG_ACTIVITY_NEW_TASKe FLAG_ACTIVITY_CLEAR_TASKinsieme hanno funzionato.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

3

Volevo solo aggiungere un modo per farlo in Kotlin:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Più di un modo Kotlin: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

3

Risposta tardiva, ma aggiunge profondità ad altre risposte. Tutto si riduce a cosa vuoi che accada con altre attività iniziate da quell'attività

Opzione 1: solo questa attività non dovrebbe avere una cronologia delle attività di chiamata

Quindi fai semplicemente:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Opzione 2 - Tutte le attività avviate da quella specifica attività non dovrebbero avere una cronologia

Quindi aggiungi nel manifesto dell'attività chiamante:

android:noHistory="true" 

Ma se vuoi avere la cronologia in una nuova attività, devi rimuovere manualmente il flag:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Spero che questo chiarisca altre risposte :)


2

Prova FLAG_ACTIVITY_CLEAR_TOP se l'attività è già in esecuzione:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


-4

Non puoi sovrascrivere il pulsante Indietro sulla particolare attività per interrompere la funzionalità di "ritorno"?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
Non farlo. È accettabile intercettare BACK per scopi specifici, ma farlo esclusivamente per consumare silenziosamente la pressione BACK e impedire la terminazione di un messaggio Activitynon è una buona pratica.
Squonk

1
D'accordo del tutto… solo un'opzione.
Broak

1
C'è OnBackPressedper quello.
Fred
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.