Hinzufügen des verknüpften Problems im Tracker: Ссылка
Also habe ich heute die Version DP5 Android 7.0 auf meinem Nexus 5X installiert. Ich habe an einer App gearbeitet, die lokale Benachrichtigungen zu bestimmten Zeiten mithilfe der AlarmManager-Klasse von Android plant. Bis zu dieser Version hat der Code auf Geräten mit KitKat, Lollipop und Marshmallow funktioniert.
Ich plane im Folgenden die Alarme:
%Vor%Mein AlarmManagerUtil @onReceive von "SET_NOTIFICATION_INTENT" sieht folgendermaßen aus:
%Vor%Was seltsam ist, ist, dass "reminderToFire" hier null ist nur auf Android N-Geräten , aber das timeToFire ist korrekt.
Ich denke, es ist etwas mit der Parceler Library zu tun? Ich kompiliere mit Java 1.8 und Targeting Android API 24.
Ich habe definitiv im Netz nach einer Antwort gesucht, aber mein Fall ist ein bisschen einzigartig, da der Code 100% bei allen früheren Versionen von Android funktioniert (alles unter N Vorschau) ... also folge ich dem unten beantwortet so viel wie ich kann:
Wie kann ich einzigartige Extras korrekt weitergeben? zu einer ausstehenden Absicht?
Hat jemand anderes dieses Problem?
Wenn jemand hier über AlarmManager die Haare rauszieht (und noch nicht aufgegeben hat und zu JobScheduler gegangen ist), unterstützt Google im Build der Produktions-API 24 nicht die Übergabe eines parzellierbaren Objekts an den AlarmManager.
So habe ich das verstanden: Wenn Sie eine Liste (oder ein einzelnes Objekt) an den AlarmManager senden müssen, speichern Sie das Element in SharedPreferences als String. (Gson.toJson (Objekt, Typ)) Wenn das Objekt eine Schnittstelle ist, gibt es eine Reihe von Schnittstellenadapterlösungen. Eine, die ich bei S / O gefunden habe:
%Vor%Sobald Sie den Adapter eingerichtet haben, müssen Sie GS0N nicht jedes Mal mit dem TypeAdapter einrichten, wenn Sie eine Art von DI-Framework (d. h. Dagger2) wie folgt verwenden ...
%Vor%Alles, was Sie tun müssen, ist zu rennen ....
%Vor%Hoffe, das hilft. Natürlich, wenn Sie dieses Objekt aus den gemeinsamen Einstellungen entfernen müssen ....
%Vor%Das typische List-Objekt = gson.fromJson (json, type) sollte funktionieren.
Prost.
Ich habe diese Art von Verhalten zuvor mit benutzerdefinierten Parcelable
-Objekten und Systemdiensten (z. B. NotificationManager
) gemeldet. Es scheint so zu sein, dass das System versucht, PendingIntent
zu verwenden, und als Teil davon versucht es, un Parcel
the Parcelable
zu deaktivieren. Dies schlägt fehl, weil das System Ihre Klassen nicht besitzt. Ich habe noch nicht gehört, dass jemand eine Weile hier reingeraten ist, aber es ist durchaus möglich, dass es in Android N eine Regression gibt, die es wieder eingeführt hat.
Sie können LogCat durchforsten, um zu sehen, ob es Meldungen (oder besser Stack-Traces) vom System (nicht Ihrer App) gibt, die zu Ihrem Alarmereignis gehören.
Wenn Sie einen reproduzierbaren Testfall erstellen können, reichen Sie ein Problem auf dem Android Issue Tracker ein. Wenn du darüber nachdenkst, poste hier einen Link, denn ich möchte einen Blick darauf werfen.
Im Hinblick auf Workarounds kann ich mir zwei vorstellen:
Setze Parcelable
nicht dort ein. Setzen Sie stattdessen eine ID, die Sie verwenden können, um die Informationen nach Bedarf nachzuschlagen, sei es aus einem In-Memory-Cache (wenn Ihr Prozess noch in der Nähe ist) oder aus dem, was Ihr persistenter Datenspeicher ist.
Wechseln Sie von Parcelable
zu dem, was ich und andere als "bündelfähig" bezeichnet haben, wo Sie Ihr Objekt in und aus einem Bundle
konvertieren. Grundsätzlich sollten Sie ausschließlich an OS-definierten Klassen ohne benutzerdefinierte Klassen festhalten. Dann kann das System sicher co_de% the Parcel
(aus welchem Grund auch immer). Dies ist natürlich viel schmerzhafter als einfach einen Annotationsprozessor zu verwenden, um die Bundle
-Implementierung zu erstellen.
Ich habe festgestellt, dass das Umbrechen des Parcelable in einem Bundle funktioniert.
%Vor%Ich bin mir jedoch nicht sicher, wie zukunftssicher dieser Ansatz ist. Ich habe das Problem auf dem Android-Bug-Tracker kommentiert: Ссылка , aber ich bezweifle, dass es eine Antwort erhält, da das Problem bereits als geschlossen markiert wurde.
Tags und Links android android-notifications alarmmanager android-7.0-nougat parceler