2012-09-20 9 views
6

Ich habe eine Vordergrunddienstbenachrichtigung, die beim Klicken eine Aktivität starten sollte. Diese Aktivität ist sehr kurzlebig, bevor sie finish() aufruft.Benachrichtigung pendingInteent contentIntent schlägt fehl, wenn Aktivitätsaufrufe beendet werden()

Das erste Mal, wenn die Benachrichtigung es das zweite Mal funktioniert geklickt wird, und danach bekomme ich den Fehler:

Sending contentIntent failed: android.app.PendingIntent$CanceledException 

In meinem Code, wenn die Vordergrundservicemeldung Erstellen habe ich die randomActivity.class geändert Eine andere Aktivitätsklasse, die nicht als Ziel bezeichnet wird und bei jedem Klick funktioniert. Von:

Intent notificationIntent = new Intent(this, RandomActivity.class); 

zu:

Intent notificationIntent = new Intent(this, HomeActivity.class); 

Adaequat ...

habe ich den Standard-Benachrichtigungscode aus der Android Developers-Website, sowie Testen sie mit Benachrichtigung Builder verwendet. Ich bekomme trotzdem das gleiche Ergebnis. Es funktioniert perfekt, es sei denn, die Aktivität ruft finish() auf;

Ist dieses erwartete Verhalten, ein Fehler, oder fehlt mir etwas?

Ich danke Ihnen im Voraus für Sie Hilfe und hoffentlich eine Lösung!

Hinweis: Der von mir verwendete Benachrichtigungscode ist vollständig standardisiert, daher habe ich ihn nicht veröffentlicht. RandomActivity ruft finish() auf; in onCreate, also ist auch nichts Ungewöhnliches dort zu sehen.

Antwort

9

Nachdem ich alles Mögliche versucht hatte, fand ich schließlich eine Lösung. Veröffentlichen für den Fall, dass jemand auch über dieses Problem stolpert.

Ich musste den int requestCode mit der Benachrichtigungs-ID übereinstimmen. Warum? Absolut keine Ahnung ... Ich kann nur annehmen, dass es verhindert, dass die Absichtsdaten null werden oder sie wiederverwenden.

private static int ONGOING_NOTIFICATION_ID = 76; 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 
    ONGOING_NOTIFICATION_ID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Das selbe wie die Benachrichtigung ID startForeground:

this.startForeground(ONGOING_NOTIFICATION_ID, not); 

Hope this jemand hilft.

+0

Ich stimme @brandall zu. Wenn Sie Aktionsschaltflächen verwenden, sollte die notificationID immer noch den requestCode aus dem contentIntent und keiner der Aktionsabsichten verwenden. – fahmad6

2

Ich musste nicht die Benachrichtigungs-ID (wie Sie vorgeschlagen) überprüfen, aber ich musste das Flag zu FLAG_UPDATE_CURRENT, anstatt FLAG_ONE_SHOT ändern.

Mit FLAG_ONE_SHOT wird die ausstehende Absicht nach der Zustellung storniert, und danach wird durch das Aufheben der Benachrichtigung nicht mehr dieselbe ausstehende Absicht übermittelt, daher die Ausnahme.

Das war das Problem für mich.

Verwandte Themen