Meine App verfügt über Benachrichtigungen, die - offensichtlich - ohne Flaggen jedes Mal eine neue Aktivität starten, sodass mehrere gleiche Aktivitäten übereinander ausgeführt werden, was einfach falsch ist.
Ich möchte, dass die in den anstehenden Absichten für Benachrichtigungen angegebene Aktivität nach vorne gebracht wird, wenn sie bereits ausgeführt wird, andernfalls wird sie gestartet.
Bisher ist die Absicht / ausstehende Absicht für diese Benachrichtigung, die ich habe,
private static PendingIntent prepareIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
und seltsamerweise funktioniert es manchmal, manchmal nicht ... Ich habe das Gefühl, ich habe bereits jede einzelne Kombination von Flaggen ausprobiert.
onNewIntent
Ich denke, der beste Weg, dies auf einfache Weise zu tun, besteht darin, die Aktivität normal zu starten, diese Aktivität jedoch im Manifest mit der
singleInstance
Eigenschaft festzulegen. Damit nähern Sie sich praktisch beiden Problemen, die Sie gerade haben, indem Sie die Aktivität ständig in den Vordergrund stellen und das Betriebssystem automatisch eine neue erstellen lassen, wenn keine Aktivität vorhanden ist, oder die aktuell vorhandene Aktivität in den Vordergrund stellen (dank dersingleInstance
Eigentum).Auf diese Weise wird eine Aktivität als einzelne Instanz deklariert:
Um eine abgehackte Animation beim Starten über singleInstance zu vermeiden, können Sie stattdessen "singleTask" verwenden. Beide sind sehr ähnlich, aber der Unterschied wird hier gemäß der Google-Dokumentation erläutert:
Hoffe das hilft.
Grüße!
quelle
Ich denke, was Sie brauchen, ist
singleTop
Activity
eher als einsingleTask
odersingleInstance
.Was in der Dokumentation steht, passt perfekt zu Ihren Anforderungen:
Darüber hinaus (kein Wortspiel beabsichtigt) hatte ich genau das gleiche Bedürfnis wie Sie. Ich habe alle getestet
launchMode
Flags , um herauszufinden, wie sie sich in der Praxis tatsächlich verhalten. DahersingleTop
ist dies das Beste: Keine seltsame Animation, App wird einmal in der Liste der letzten Anwendungen angezeigt (im Gegensatz dazusingleInstance
wird sie zweimal angezeigt , da dies nicht der Fall ist.) t zulassen, dass ein andererActivity
Teil seiner Aufgabe ist) und sich richtig verhält, unabhängig davon, ob das ZielActivity
bereits existiert oder nicht.quelle
Dies ist ein alter Thread, aber für alle, die noch nach einer Antwort suchen, ist hier meine Lösung. Es ist rein im Code, ohne Manifest-Einstellungen:
Hier öffnet FLAG_ACTIVITY_SINGLE_TOP vorhandene Aktivitäten, wenn sie sich oben im Taskstapel befinden. Wenn es sich nicht oben, sondern im Stapel befindet, entfernt FLAG_ACTIVITY_CLEAR_TOP alle Aktivitäten über der Zielaktivität und zeigt sie an. Wenn sich die Aktivität nicht im Aufgabenstapel befindet, wird eine neue erstellt. Ein entscheidender Punkt, den es zu erwähnen gilt - der zweite Parameter von PendingIntent.getActivity (), dh requestCode sollte einen Wert ungleich Null haben (ich habe ihn in meinem Snippet sogar NON_ZERO_REQUEST_CODE genannt), sonst funktionieren diese Intent-Flags nicht. Ich habe keine Ahnung, warum es so ist wie es ist. Das Flag FLAG_ACTIVITY_SINGLE_TOP ist austauschbar mit Android: launchMode = "singleTop" im Aktivitäts-Tag im Manifest.
quelle
Ich weiß, dass es alt ist, aber nichts von dem oben genannten passte zu meiner Bewerbung.
Ohne Änderungen an Manifesten und anderen Konfigurationen finden Sie hier den Code, mit dem Sie Ihre App wieder nach vorne bringen oder öffnen können, wenn sie geschlossen wird
quelle
Ich habe es versucht und es hat funktioniert, obwohl sich die IDE über den Code beschwert hat
quelle
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
keine gültige Flag für sichPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
kein gültiges Flag ist, wenn es als verwendet wirdPendingIntent
. Oder haben Sie vielleicht gemeint, dass es nicht gültig ist, an diegetActivity
Methode zu übergeben, sondern alsIntent
Flag verwendet wird, das dann als verwendet wirdPendingIntent
?Da Sie sagen, dass Sie Ihre Aktivität starten möchten, wenn sie noch nicht gestartet wurde, würde es Ihnen vielleicht nichts ausmachen, sie neu zu starten. Ich habe auch eine Menge Vorschläge und Flaggenkombinationen für die Absicht getestet. Dadurch wird immer die Aktivität, die Sie benötigen, in den Vordergrund gerückt, obwohl kein zuvor damit verbundener Status beibehalten wird.
Nur API11 +.
quelle
Ich hatte ein ähnliches Problem, nachdem ich Benachrichtigungen hinzugefügt hatte, die auf der Android-Trainingsseite zu finden waren . Keine der anderen Antworten hier hat für mich funktioniert, aber diese Antwort hat für mich funktioniert. Zusammenfassung:
quelle