这里是问题。我的程序在Android 6.0上运行得很完美。升级设备到Android 7.0后,PendingIntent无法将可包含数据传递到广播接收器。以下是代码。
触发警报
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是一个可序列化的类,而todo是我在通知中需要的实例。
在BroadcastReceiver中,我无法获取可序列化数据。
public void onReceive(Context context, Intent intent) {
Todo todo = intent.getParcelableExtra("KEY_TODO");
}
以下是我调试时意图的结果
我不知道为什么这个意图只包含一个我从未放置的整数。可 Parcelable 的待办事项在哪里。 这段代码在 Android 6.0 中没有问题,但无法在 7.0 上运行。
Todo
对象添加到“extras”之前将其包装在Bundle
中吗?当将自定义的Parcelable
对象传递给AlarmManager
时,这通常是有效的(但在Android 7中可能已经失效)。我会对你的发现感兴趣。 - David WasserBundle bundle = new Bundle; bundle.putParcelable("todo", todo); intent.putExtra("KEY_TODO", bundle);
。提取额外内容:Bundle bundle = intent.getBundleExtra("KEY_TODO"); if (bundle != null) { Todo todo = bundle.getParcelableExtra("todo"); }
- David Wasser