0

Hier ist das Problem. Mein Programm läuft perfekt in Android 6.0. Nach dem Update das Gerät auf Android 7.0. Pendingintent kann die parzellierbaren Daten nicht an boradcast-receiver übergeben. Hier ist der Code.Pendingintent getbroadcast verloren parcelable Daten

Feuer der Alarm

public static void setAlarm(@NonNull Context context, @NonNull Todo todo) { 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmReceiver.class); 
    intent.putExtra("KEY_TODO", todo); 
    PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, todo.remindDate.getTime(), alarmIntent); 
} 

Todo ist ein Parcel Klasse während todo die Instanz ich in Benachrichtigung benötigen ist.

In Broadcastceiver kann ich nicht Parcelable Daten bekommen.

public void onReceive(Context context, Intent intent) { 

    Todo todo = intent.getParcelableExtra("KEY_TODO"); 

} 

Hier das Ergebnis der Absicht ist, wenn ich enter image description here

debuggen Ich weiß nicht, warum nur die Absicht, eine Integer enthält, dass ich es nie in. Wo ist die Parcel todo. Dieser Code hat kein Problem in Android 6.0, aber laufen nicht in 7.0

+0

Haben Sie Ihre 'Todo' Objekt in einem' Bundle' versucht Verpackung, bevor es zu den „Extras“ und fügte hinzu? Dies funktioniert normalerweise, wenn benutzerdefinierte "Parcelable" -Objekte an den "AlarmManager" übergeben werden (aber jetzt in Android 7 defekt sein können). Ich wäre an Ihren Ergebnissen interessiert. –

+0

Um hinzuzufügen: 'Bundle Bundle = neues Bundle; bundle.putParcelable ("todo", todo); intent.putExtra ("KEY_TODO", Bündel); '. Extra extrahieren: 'Bündel bundle = intent.getBundleExtra (" KEY_TODO "); if (Bündel! = null) {Todo todo = bundle.getParcelableExtra ("todo"); } ' –

Antwort

9

Zitiert myself:

Benutzerdefinierte Parcelable Klassen — diejenigen, die einmalig für Ihre Anwendung, nicht ein Teil des Android Framework — gehabt haben intermittierende Probleme über die Jahre als Intent Extras verwendet. Wenn ein Prozess des Haupt-Betriebssystems die Intent Extras modifizieren muss, versucht dieser Prozess, Ihre Parcelable Objekte als Teil der Einrichtung der Extras Bundle für Änderung neu zu erstellen. Dieser Prozess hat Ihre Klasse nicht und daher wird eine Laufzeitausnahme ausgelöst.

Ein Bereich, in dem dies auftreten kann, ist mit AlarmManager. Code, der benutzerdefinierte Parcelable Objekte mit AlarmManager verwendet, die auf älteren Versionen von Android will not work on Android N funktioniert haben könnte.

Die wirksamste Abhilfe, die ich kenne, ist manuell die sie Parceable in ein byte[] zu konvertieren und die extra in den Intent zu setzen, ihn manuell wieder in eine Parcelable Umwandlung nach Bedarf. This Stack Overflow answer zeigt die Technik, und this sample project bietet ein komplettes funktionierendes Beispiel.

Die Tastenbits sind die Umsätze zwischen den Parcelable und dem byte[]:

/*** 
Copyright (c) 2016 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.parcelable.marshall; 

import android.os.Parcel; 
import android.os.Parcelable; 

// inspired by https://stackoverflow.com/a/18000094/115145 

public class Parcelables { 
    public static byte[] toByteArray(Parcelable parcelable) { 
    Parcel parcel=Parcel.obtain(); 

    parcelable.writeToParcel(parcel, 0); 

    byte[] result=parcel.marshall(); 

    parcel.recycle(); 

    return(result); 
    } 

    public static <T> T toParcelable(byte[] bytes, 
            Parcelable.Creator<T> creator) { 
    Parcel parcel=Parcel.obtain(); 

    parcel.unmarshall(bytes, 0, bytes.length); 
    parcel.setDataPosition(0); 

    T result=creator.createFromParcel(parcel); 

    parcel.recycle(); 

    return(result); 
    } 
} 
+0

Sie sparen meinen Tag !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Es ist das Android N-System, dass ich die parzellierbaren Daten mit AlarmManager nicht weitergeben kann. – BIN