0

В этом проблема. Моя программа отлично работает в Android 6.0. После обновления устройства на Android 7.0. Pendingintent не может передавать предоставленные данные репозитарию boradcast. Вот код.Pendingintent getbroadcast потерял достоверные данные

Пожарная сигнализация

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 является Parcelable класс, а TODO является экземпляр мне нужно в уведомлении.

В Broadcastreceiver, я не могу получить данные по Porcelable.

public void onReceive(Context context, Intent intent) { 

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

} 

Вот результат намерения, когда я отладки enter image description here

Я не знаю, почему цель содержит только целое число, что я никогда не положить его. Где Parcelable TODO. Этот код не имеет никаких проблем в Android 6.0, но не может работать в 7,0

+0

Вы пробовали оборачивать свой 'объекта Todo' в' Bundle' перед добавлением его в «дополнительные услуги»? Обычно это работает при передаче пользовательских «Parcelable» объектов в «AlarmManager» (но теперь они могут быть разбиты на Android 7). Меня бы интересовали ваши выводы. –

+0

Чтобы добавить дополнительно: 'Пакет связок = новый пакет; bundle.putParcelable («todo», todo); intent.putExtra ("KEY_TODO", bundle); '. Чтобы извлечь дополнительную информацию: 'Пакет связок = aim.getBundleExtra (« KEY_TODO »); if (bundle! = null) {Todo todo = bundle.getParcelableExtra ("todo"); } ' –

ответ

9

Цитирование myself:

Пользовательские Parcelable классы — те уникальные для вашего приложения, а не часть в Android рамках — имели прерывистые проблемы по сравнению с годами, когда используется как Intent. В принципе, если основной процесс ОС должен изменить дополнительные функции Intent, этот процесс завершает попытку , чтобы воссоздать объекты Parcelable как часть настройки дополнительных объектов Bundle для модификации. Этот процесс не имеет вашего класса , поэтому он получает исключение во время выполнения.

Одна из областей, где это может произойти, - AlarmManager. Код, который использовал пользовательских Parcelable объектов с AlarmManager, которые могли бы работать в старых версиях Android will not work on Android N.

Наиболее эффективный обходной путь, который я знаю, чтобы вручную преобразовать Parceable себя в byte[] и положить, что в Intent дополнительных вручную преобразовать его обратно в Parcelable по мере необходимости. This Stack Overflow answer показывает технику, и this sample project обеспечивает полный рабочий образец.

бит ключа является преобразованием между Parcelable и 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

вы спасите мой день !!!!!!!!!!!!!!!!!!!!!!!!!!!!! Это система Android N, что я не могу передать подробные данные с помощью AlarmManager. – BIN

Смежные вопросы