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.