Wie bringe ich eine Aktivität in den Vordergrund (oben auf dem Stapel)?


89

In Android habe ich eine Aktivität ExampleActivity definiert.

Als meine Anwendung gestartet wurde, wurde beispielsweise eine Instanz dieser A-Aktivität erstellt A. Wenn der Benutzer auf eine Schaltfläche geklickt hat, wurde eine Aweitere Instanz von B-Activity, B, erstellt. Jetzt ist der Aufgabenstapel BA, mit B an der Spitze. Dann klickte der Benutzer auf eine Schaltfläche auf B, einer anderen Instanz von C-Activity, und C wurde erstellt. Jetzt ist der Aufgabenstapel CBA, wobei C oben steht.

Wenn der Benutzer auf eine Schaltfläche auf C klickt, möchte ich, dass die Anwendung A in den Vordergrund rückt, dh dass A ganz oben im Task-Stack (ACB) steht.

Wie kann ich den Code schreiben, um dies zu erreichen?

Antworten:


107

Sie können dies versuchen FLAG_ACTIVITY_REORDER_TO_FRONT(das Dokument beschreibt genau, was Sie möchten)


3
Ich denke, es sollte FLAG_ACTIVITY_SINGLE_TOP sein .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPwird hier nicht helfen. Wenn sich ActivityC oben im Stapel befindet und startActivity()zum Starten von ActivityA aufgerufen wird, FLAG_ACTIVITY_SINGLE_TOPwird auch beim Festlegen eine neue Instanz von ActivityA erstellt. FLAG_ACTIVITY_SINGLE_TOPVerhindert die Erstellung einer neuen Instanz nur, wenn Sie versuchen, eine Aktivität zu starten, die sich bereits oben im Stapel befindet . In diesem Fall befindet sich ActivityA nicht ganz oben im Stapel, sodass Android eine neue Instanz erstellt.
David Wasser

6
Genial! Wird verwendet (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP), um einen Verlauf nach einem bestimmten Wert zu löschen Activity.
Shkschneider

9
FLAG_ACTIVITY_REORDER_TO_FRONT wird ignoriert, wenn Sie auch FLAG_ACTIVITY_CLEAR_TOP angeben. Überprüfen Sie die Dokumentation.
Kris Subramanian

3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Dies funktioniert einwandfrei, wenn Sie Ihre Aktivität mit der Benutzersitzung in den Vordergrund stellen möchten, wenn sie sich bereits oben auf dem Backstack, aber nicht vorne befindet.
Hassan Jamil

62

Der beste Weg, dies zu tun, war, die gleiche Absicht zu verwenden, die der Android-Startbildschirm verwendet - den App Launcher.

Beispielsweise:

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

Auf diese Weise wird jede Aktivität in meinem Paket, die zuletzt vom Benutzer verwendet wurde, wieder in den Vordergrund gerückt. Ich fand dies nützlich, wenn ich den PendingIntent meines Dienstes verwendete, um den Benutzer wieder zu meiner App zu bringen.


2
Vielen Dank für diesen Code. Ich habe Stunden damit verschwendet, das richtig zum Laufen zu bringen.
PakitoV

3
oder ohne ComponentName und setComponent, aber mit neuer Absicht (dies, MyMainActivity.class)
Tima

3
Seltsam, da dies das einzige war, was für mich funktionierte; Das Setzen von Flags hat nicht funktioniert und die Aktivität immer neu erstellt.
Steven Huang

5
Wenn ich diese Antwort und die Kommentare lese, ist klar, dass wir ein Missverständnis haben. Die ursprüngliche Frage lautet, wie ein Activityinnerhalb des Aufgabenstapels neu angeordnet werden kann. OP gibt eindeutig an, dass er ActivityAvon der Unterseite des Stapels zur Oberseite des Stapels wechseln möchte (dh er möchte ActivityA an die Vorderseite des Aufgabenstapels neu anordnen ). Diese Antwort wird das nicht tun. Diese Antwort ist eine Antwort auf die Frage "Wie kann ich meine Anwendung (Aufgabenstapel) aus dem Hintergrund in den Vordergrund stellen?" Das ist eine ganz andere Frage als die ursprüngliche Frage von OP.
David Wasser

3
Der Upvote-Button sagt auch "Diese Antwort ist hilfreich", nicht "Diese Antwort ist hilfreich für die Operation" - er / sie hat bereits "Akzeptieren" für diese Situation. Offensichtlich weiß ich nicht, was für die Operation hilfreich ist, und IMHO-Downvoting-Antworten, basierend auf meiner Vermutung, was für die Operation hilfreich ist, sind falsch.
Boris Treukhov

28

Hier ist ein Codebeispiel, wie Sie es tun können:

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

Dadurch wird sichergestellt, dass Sie nur eine Instanz einer Aktivität auf dem Stapel haben.

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 : Wenn in einem an Context.startActivity () übergebenen Intent festgelegt, wird die gestartete Aktivität an die Vorderseite des Verlaufsstapels ihrer Aufgabe verschoben, wenn sie bereits ausgeführt wird.

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

4

Ich denke, eine Kombination von IntentFlaggen sollte den Trick tun. Insbesondere Intent.FLAG_ACTIVITY_CLEAR_TOPund Intent.FLAG_ACTIVITY_NEW_TASK.

Fügen Sie diese Flags Ihrer Absicht hinzu, bevor Sie anrufen startActvity.


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Hinweis Ihr Homeaktivitäts-Startmodus sollte single_task sein


1

Im Allgemeinen denke ich, dass diese Methode des Aktivitätsmanagements nicht empfohlen wird. Das Problem bei der Reaktivierung einer Aktivität zwei Schritte weiter in The Stack besteht darin, dass diese Aktivität wahrscheinlich beendet wurde. Mein Rat, sich an den Stand Ihrer Aktivitäten zu erinnern und sie mit zu startenstartActivity ()

Ich bin sicher, Sie haben diese Seite gesehen, aber für Ihre Bequemlichkeit diesen Link


0

Wenn Sie beim Klicken auf eine Benachrichtigung eine Aktivität an den oberen Rand des Stapels bringen möchten, müssen Sie möglicherweise die folgenden Schritte ausführen, damit FLAG_ACTIVITY_REORDER_TO_FRONT funktioniert:

Die Lösung für mich bestand darin, einen Rundfunkempfänger zu erstellen, der Rundfunkaktionen abhört, die durch die Benachrichtigung ausgelöst werden. Also im Grunde genommen:

  1. Die Benachrichtigung löst eine Broadcast-Aktion mit einem zusätzlichen Namen der zu startenden Aktivität aus.

  2. Der Broadcast-Empfänger erkennt dies, wenn auf die Benachrichtigung geklickt wird, und erstellt dann die Absicht, diese Aktivität mit dem Flag FLAG_ACTIVITY_REORDER_TO_FRONT zu starten

  3. Die Aktivität wird an die Spitze des Aktivitätsstapels gebracht, keine Duplikate.


-2

Wenn Sie die "Google Cloud-Nachricht" verwenden, um Push-Benachrichtigungen mit der Klasse "PendingIntent" zu erhalten, zeigt der folgende Code die Benachrichtigung nur in der Aktionsleiste an.

Wenn Sie auf die Benachrichtigung klicken, wird keine Aktivität erstellt. Die letzte aktive Aktivität wird ohne Probleme wiederhergestellt.

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.