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 A
weitere 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?
quelle
FLAG_ACTIVITY_SINGLE_TOP
wird hier nicht helfen. Wenn sich ActivityC oben im Stapel befindet undstartActivity()
zum Starten von ActivityA aufgerufen wird,FLAG_ACTIVITY_SINGLE_TOP
wird auch beim Festlegen eine neue Instanz von ActivityA erstellt.FLAG_ACTIVITY_SINGLE_TOP
Verhindert 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.(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)
, um einen Verlauf nach einem bestimmten Wert zu löschenActivity
.Der beste Weg, dies zu tun, war, die gleiche Absicht zu verwenden, die der Android-Startbildschirm verwendet - den App Launcher.
Beispielsweise:
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.
quelle
Activity
innerhalb des Aufgabenstapels neu angeordnet werden kann. OP gibt eindeutig an, dass erActivityA
von 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.Hier ist ein Codebeispiel, wie Sie es tun können:
Dadurch wird sichergestellt, dass Sie nur eine Instanz einer Aktivität auf dem Stapel haben.
quelle
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.
quelle
Ich denke, eine Kombination von
Intent
Flaggen sollte den Trick tun. InsbesondereIntent.FLAG_ACTIVITY_CLEAR_TOP
undIntent.FLAG_ACTIVITY_NEW_TASK
.Fügen Sie diese Flags Ihrer Absicht hinzu, bevor Sie anrufen
startActvity
.quelle
i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
Hinweis Ihr Homeaktivitäts-Startmodus sollte single_task sein
quelle
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 starten
startActivity ()
Ich bin sicher, Sie haben diese Seite gesehen, aber für Ihre Bequemlichkeit diesen Link
quelle
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:
Die Benachrichtigung löst eine Broadcast-Aktion mit einem zusätzlichen Namen der zu startenden Aktivität aus.
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
Die Aktivität wird an die Spitze des Aktivitätsstapels gebracht, keine Duplikate.
quelle
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!
quelle