Ich verwende diese Lösung: Wie kann der Benachrichtigungsabruf fortgesetzt werden, anstatt eine neue Absicht zu erstellen?
Ich arbeite gut, wenn ich meine App normal ausführe .. aber meine App hat eine Share-Funktion.
Wenn ich die Bilder, die ich aus der Galerie-App freigeben möchte, auswähle und sie in meiner Aktivität öffne, erstelle ich eine Benachrichtigung in der Aktivität. Ich möchte, dass, wenn ein Benutzer auf die Benachrichtigung klickt, die vorhandene Aktivität (geöffnet von der Galerie-App) geöffnet wird
Das Problem ist, dass wenn ich auf die Benachrichtigung klicke, es diese Aktivität nicht wieder aufnimmt, sondern stattdessen eine neue Instanz der Aktivität oder einer anderen bereits zuvor geöffneten Instanz öffnet
Bearbeiten: Weitere Erklärung
Meine App heißt ShareApp und die Aktivität heißt ShareActivity Das Problem ist, dass beim Öffnen der ShareActivity über die Galerie-App eine Instanz der ShareActivity am oberen Rand des Stapels der Galerie-App-Aufgabe erstellt wird. Wenn ich nun eine Benachrichtigung erstelle, die auf meine ShareActivity verweist, verwende ich die Intention:
%Vor%Problem ist, dass, wenn ich auf die Benachrichtigung klicke, es auf die Instanz der ShareActivity im Stapel der ShareApp-Aufgabe statt des Stacks der Galerie-App-Aufgabe zeigt.
Irgendeine Idee, wie man auf den Stack der richtigen Aufgabe zeigt ??
2: Mein Code bearbeiten
%Vor%Bearbeiten Sie 3: adb shell dumpsys Aktivität (nach der Anwendung des Codes von David Ссылка )
Meine App heißt shareApp und meine Aktivität ist ShareActivity
Bevor Sie auf die Benachrichtigung klicken:
%Vor%Nach dem Klicken auf die Benachrichtigung:
%Vor% Wenn Sie mehrere Instanzen von ShareActivity
in verschiedenen Aufgaben aktiviert haben, können Sie Android nicht sagen, welche Aufgabe durch Starten Ihrer Aktivität reaktiviert werden soll. Es klingt für mich wie das, was Sie tun möchten, in diesem Fall ist nicht Ihre Aktivität, sondern die Galerie-Anwendung zu starten. Wenn die Galerie-App bereits ausgeführt wird und sich Ihre Aktivität oben auf dem Aufgabenstapel befindet, müssen Sie lediglich die Galerie-App in den Vordergrund bringen. Erstellen Sie dazu einen "Launch Intent" für die Gallery-App und stellen Sie sicher, dass Intent.FLAG_ACTIVITY_NEW_TASK
auf den Intent gesetzt ist. Du solltest einen "Launch Intent" von PackageManager
bekommen, indem du getLaunchIntentForPackage()
BEARBEITEN: Beispielcode mit ActivityManager
Sie können dies versuchen:
%Vor% HINWEIS: Sie benötigen dazu GET_TASKS
-Erlaubnis. Ich habe das nicht versucht und kann nicht garantieren, dass es funktioniert. Die Verwendung von getRunningTasks()
wird von der Dokumentation nicht empfohlen, aber das bedeutet nicht, dass es nicht für Ihre Zwecke geeignet ist.
Die hinzugefügte Aktion / Kategorie zur Absicht hinzufügen
HINWEIS: Ich habe tatsächlich eine kleine App gebaut, um das zu testen. Ich musste ACTION = MAIN und CATEGORY = LAUNCHER zum Intent hinzufügen (das wäre da, wenn du PackageManager.getLaunchIntentForPackage()
benutzt hättest. Ich habe ein HTC One S, also heißt die App "Gallery" auf meinem Gerät eigentlich com.htc.album/.AlbumMain.ActivityMainDropList
, aber dies sollte immer noch für Sie arbeiten.
Kopieren Sie einfach den Code und fügen Sie ihn in Ihre Haupt-Launcher-Aktivität ein.
Dies ist eine Lösung, die ich seit Jahren verwende.
Ihr Problem besteht darin, dass Ihr PendingIntent sein Ziel aus einem appless-Inhalt heraus startet.
Der erste Schritt besteht darin, das Ergebnis Ihrer Absicht in den Kontext Ihrer Apps zu bringen. Rufen Sie dazu eine Benachrichtigung an "ForwardingReceiver"
%Vor% Das ForwardingReceiver
erweitert BroadcastReceiver
und in seiner onReceive()
-Methode haben Sie jetzt den aktuellen Kontext Ihrer Apps und können sendOrderedBroadcast()
so verwenden:
Nun, der spaßige Teil. Sie müssen alle Ihre Apps-Aktivitäten von einem gemeinsamen übergeordneten Aktivitätenelement erweitern. Sie können dies bereits für die Protokollierung oder Analyse tun. In diesem CommonActivityParent onResume()
müssen Sie sich registrieren, um Broadcasts mit einer Priorität von über 0 (z. B. 10) zu empfangen
(Denken Sie daran, dies in onPause ()) aufzuheben.
Wenn Ihre App im Vordergrund ist, wird der Benachrichtigungsklick (indirekt) angezeigt und Sie können eine Aktion ausführen.
Wenn sich Ihre Aktivität jedoch im Hintergrund befindet, wird dieser Empfänger nicht registriert. Kein Problem, Ihr "GenericReceiver" sollte in etwa so aussehen
%Vor%Was Ihre Startaktivität startet. Diese Startaktivität sollte Code in onCreate () enthalten, um zu erkennen, ob es der Stamm der Aufgabe ist. Wenn nicht, sollte es sofort geschlossen werden (und ist daher für den Benutzer nie sichtbar). Dadurch wird die letzte offene Aufgabe effektiv in den Vordergrund gerückt:
%Vor% Stellen Sie sicher, dass Sie nach dem Aufruf von registerReceiver()
in CommonActivityParent die folgende Überprüfung durchführen:
An hey presto - Ihre App funktioniert jetzt so, als ob ein Benachrichtigungsklick tatsächlich ein Klick von Ihrer App aus ist. Und alles, was dazu nötig war, war verdammt viel Arbeit!
Hoffentlich hat jemand eine weniger komplizierte Art, dies zu tun.
Tags und Links android notifications