Добавление связанного вопроса на трекере: https://code.google.com/p/android/issues/detail?id=216581&thanks=216581&ts=1468962325DP5 7.0 - Устраняет ли добавление дополнительных ожидающих намерений?
Так я установил 7.0 релиз DP5 Android на моем Nexus 5X сегодня. Я работаю над приложением, которое рассылает локальные уведомления в определенное время с помощью Android AlarmManager. До этого релиза код отлично работает на устройствах, работающих с KitKat, Lollipop и Marshmallow.
Ниже, как я планирования тревоги:
Intent intent = new Intent(context, AlarmManagerUtil.class);
intent.setAction(AlarmManagerUtil.SET_NOTIFICATION_INTENT);
intent.putExtra(AlarmManagerUtil.REMINDER_EXTRA, Parcels.wrap(reminders));
intent.putExtra("time", when.getMillis());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (alarmManager != null) {
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, when.getMillis(), pendingIntent);
}
Мои AlarmManagerUtil @onReceive из "SET_NOTIFICATION_INTENT" выглядит следующим образом:
public void fireNotification(Context context, Intent intent) {
List<Reminder> reminderToFire = Parcels.unwrap(intent.getParcelableExtra(REMINDER_EXTRA));
long timeToFire = intent.getLongExtra("time", 0L); //.... }
Что странно это "reminderToFire" равна нулю здесь только на устройствах Android N, но timeToFire правильный.
Я думаю, что это связано с библиотекой Parceler? Я компилирую с использованием Java 1.8 и ориентируясь на Android API 24.
Я определенно оглядел сеть, чтобы ответить на этот вопрос, но мой случай немного уникален, поскольку код 100% работает со всеми предыдущими версиями Android (все ниже N предпросмотр) ... так что я следую ниже ответы столько, сколько я могу:
How can I correctly pass unique extras to a pending intent?
Кто-нибудь еще есть эта проблема?
Вы посмотрели, возвращает ли 'Parcels.wrap (напоминания)' null '? Вы посмотрели, возвращает ли 'intent.getParcelableExtra (REMINDER_EXTRA)' null ', прежде чем передать это значение в 'Parcels.unwrap()'? Вы пробовали наполнить некоторые другие «Parcelable» в «Intent», чтобы узнать, выживет ли он в поездке (например, «Point»)? – CommonsWare
@CommonsУбедитесь, что 'Intent', переданный в аргумент' PendingIntent' выше, загружается объектом 'mExtras' с' mMap', содержащим два объекта: объект Long LongToFire и Parceled reminder. После распаковки в 'AlarmManager onReceive', Long является действительным, но объект« напоминание »имеет значение null. Я попробую Parcel другой объект, как «Point», и посмотрим, как это происходит. 'Напоминание' правильно настроено с помощью' @ Parcel' – Aceofspadez44
«При распаковке в AlarmManager onReceive длинный действителен, но объект напоминания имеет значение null» - но, является ли 'intent.getParcelableExtra (REMINDER_EXTRA)' 'null'? Это означает, что ценность теряется. Если 'intent.getParcelableExtra (REMINDER_EXTRA)' не 'null', но' Parcels.unwrap (intent.getParcelableExtra (REMINDER_EXTRA)) 'is' null', это говорит о том, что «Parcels» испытывает трудности с восстановлением объектов. – CommonsWare