【发布时间】:2016-11-22 19:03:36
【问题描述】:
在跟踪器上添加链接问题: https://code.google.com/p/android/issues/detail?id=216581&thanks=216581&ts=1468962325
所以我今天在我的 Nexus 5X 上安装了 DP5 Android 7.0 版本。我一直在开发一个使用 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);
}
我的“SET_NOTIFICATION_INTENT”的AlarmManagerUtil @onReceive 看起来像这样:
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(reminders)是否返回null?在将值传递给Parcels.unwrap()之前,您是否查看过intent.getParcelableExtra(REMINDER_EXTRA)是否返回null?您是否尝试将其他一些Parcelable填充到Intent中以查看它是否能在旅途中幸存下来(例如,Point)? -
@CommonsWare
Intent被传递到上面的PendingIntent参数中,正在加载mExtras对象,其中mMap包含两个对象,Long timeToFire和 Parceled 提醒对象。在AlarmManager onReceive中展开后,Long 有效,但reminder对象为空。我会尝试 Parcel 一些其他对象,例如Point并看看它是如何进行的。Reminder正确配置为@Parcel -
"在 AlarmManager onReceive 中解包后,Long 有效,但提醒对象为空" -- 但是,是
intent.getParcelableExtra(REMINDER_EXTRA)null?这将表明价值正在丢失。如果intent.getParcelableExtra(REMINDER_EXTRA)不是null,但Parcels.unwrap(intent.getParcelableExtra(REMINDER_EXTRA))是null,则表明Parcels难以恢复对象。 -
@CommonsWare 啊,没有
intent.getParcelableExtra(REMINDER_EXTRA)正确有数据;但是,意图中的mExtras对象会丢失mMap对象,直到它尝试获取额外内容。现在调试,实际上看起来 unwrap 是用Parcelable input = null调用的,因此返回null。运行早期版本 Android 的设备并非如此……我将在 Github 上打开Parceler库的问题。谢谢先生。 -
“它实际上看起来像使用 Parcelable input = null 调用 unwrap 并因此返回 null” - 我很困惑这如何与“intent.getParcelableExtra(REMINDER_EXTRA) 正确地拥有数据"。
标签: android alarmmanager android-notifications parceler android-7.0-nougat