Come portare un'attività in primo piano (in cima alla pila)?


90

In Android, ho definito un'attività ExampleActivity.

Quando la mia applicazione è stata avviata, è stata creata un'istanza di questa A-Activity, diciamo che lo è A. Quando l'utente ha fatto clic su un pulsante A, è stata creata un'altra istanza di B-Activity, B. Ora lo stack delle attività è BA, con B in alto. Quindi, l'utente ha fatto clic su un pulsante su B, un'altra istanza di C-Activity e C. è stata creata. Ora lo stack delle attività è CBA, con C in alto.

Ora, quando l'utente fa clic su un pulsante su C, voglio che l'applicazione porti A in primo piano, cioè faccia A essere in cima allo stack di attività, ACB.

Come posso scrivere il codice per realizzarlo?

Risposte:


108

Puoi provare questo FLAG_ACTIVITY_REORDER_TO_FRONT(il documento descrive esattamente quello che vuoi)


3
Penso che dovrebbe essere FLAG_ACTIVITY_SINGLE_TOP .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPnon aiuterà qui. Quando ActivityC è in cima allo stack e chiama startActivity()per avviare ActivityA, anche se lo imposti FLAG_ACTIVITY_SINGLE_TOP, creerà comunque una nuova istanza di ActivityA. FLAG_ACTIVITY_SINGLE_TOPimpedisce solo la creazione di una nuova istanza se stai tentando di avviare un'attività che è già in cima allo stack . In questo caso, ActivityA non è in cima allo stack, quindi Android crea una nuova istanza.
David Wasser

6
Eccezionale! Utilizzato (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)per cancellare qualsiasi cronologia dopo un dato Activity.
shkschneider

10
FLAG_ACTIVITY_REORDER_TO_FRONT viene ignorato se specifichi anche FLAG_ACTIVITY_CLEAR_TOP. Controlla la documentazione.
Kris Subramanian

3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Questo funzionerà bene se vuoi portare la tua attività in primo piano con la sessione utente se è già in cima al backstack ma non in primo piano.
Hassan Jamil

64

Il modo migliore che ho trovato per farlo è stato quello di utilizzare lo stesso intento utilizzato dalla schermata iniziale di Android: l'App Launcher.

Per esempio:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

In questo modo, qualunque attività nel mio pacchetto è stata utilizzata più di recente dall'utente viene riportata in primo piano. L'ho trovato utile usando PendingIntent del mio servizio per riportare l'utente alla mia app.


2
Grazie mille per quel pezzo di codice. Ho perso ore cercando di farlo funzionare correttamente.
PakitoV

3
o senza ComponentName e setComponent, ma con un nuovo Intent (questo, MyMainActivity.class)
Tima

3
Strano come questa era l'unica cosa che ha funzionato per me; l'impostazione dei flag non ha funzionato e ha sempre ricreato l'attività.
Steven Huang

5
Quando ho letto questa risposta e i commenti, è chiaro che abbiamo un malinteso. La domanda originale è come riorganizzare una Activityall'interno dello stack di attività. OP afferma chiaramente che vuole spostarsi ActivityAdalla parte inferiore della pila alla cima della pila (cioè: vuole riordinare ActivityA all'inizio della pila delle attività ). Questa risposta non lo farà. Questa risposta è una risposta alla domanda "Come posso portare la mia applicazione (task stack) dallo sfondo al primo piano?" Questa è una domanda completamente diversa dalla domanda originale di OP.
David Wasser

3
Anche il pulsante di voto positivo dice "Questa risposta è utile" non "questa risposta è utile per l'op" - lui / lei ha già il "segno di accettazione" per questa situazione. Ovviamente non so cosa sia utile per l'operazione e le risposte di downvoting IMHO basate sulla mia supposizione che ciò che è utile per l'operazione non sia corretto.
Boris Treukhov,

28

Ecco un esempio di codice di come puoi farlo:

Intent intent = getIntent(getApplicationContext(), A.class)

Questo ti assicurerà di avere solo un'istanza di un'attività nello stack.

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : se impostato in un Intent passato a Context.startActivity (), questo flag farà sì che l'attività avviata venga portata in primo piano nello stack della cronologia della sua attività se è già in esecuzione.

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

Penso che una combinazione di Intentflag dovrebbe fare il trucco. In particolare, Intent.FLAG_ACTIVITY_CLEAR_TOPe Intent.FLAG_ACTIVITY_NEW_TASK.

Aggiungi questi flag al tuo intento prima di chiamare startActvity.


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Nota La modalità di avvio di homeactivity dovrebbe essere single_task


1

In generale, penso che questo metodo di gestione delle attività non sia raccomandato. Il problema con la riattivazione di un'attività due passaggi più in basso nello Stack è che questa attività è stata probabilmente terminata. Il mio consiglio per ricordare lo stato delle tue attività e lanciarle constartActivity ()

Sono sicuro che hai visto questa pagina ma per tua comodità questo link


0

Se desideri portare un'attività in cima alla pila quando fai clic su una notifica, potrebbe essere necessario eseguire le seguenti operazioni per far funzionare FLAG_ACTIVITY_REORDER_TO_FRONT:

La soluzione per me per questo era creare un ricevitore di trasmissione che ascolta le azioni di trasmissione attivate dalla notifica. Quindi in poche parole:

  1. La notifica innesca un'azione di trasmissione con un extra il nome dell'attività da avviare.

  2. Il destinatario della trasmissione lo rileva quando si fa clic sulla notifica, quindi crea l'intenzione di avviare tale attività utilizzando il flag FLAG_ACTIVITY_REORDER_TO_FRONT

  3. L'attività viene portata in cima alla pila delle attività, senza duplicati.


-2

se stai utilizzando "Google Cloud Message" per ricevere notifiche push con la classe "PendingIntent", il codice seguente mostra la notifica solo nella barra delle azioni.

Facendo clic sulla notifica non verrà creata alcuna attività, l'ultima attività attiva viene ripristinata mantenendo lo stato corrente senza problemi.

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Ciao!

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.