BroadcastReceiver Intent 在没有额外的情况下交付
BroadcastReceiver Intent delivered without extras
我的 BroadcastReceiver
送货时没有收到 Intent
额外的东西。
下面是我如何创建 PendingIntent
private fun getPendingIntent(type: ReminderType, date: DateTime): PendingIntent {
val context = App.appContext
val intent = Intent(context, TimeBasedRemindersBroadcastReceiver::class.java)
intent.putExtra(ARG_REMINDER_TYPE, type)
intent.putExtra(ARG_DATE_TIME, date)
val intentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
val requestCode = date.dayOfWeek * 100 + type.ordinal
return PendingIntent.getBroadcast(
context,
requestCode,
intent,
intentFlags
)
}
如您所见,一旦 Intent 被初始化,额外的内容就会被清楚地追加。当 BroadcastReceiver
被触发时,intent.extras
为空。
经过研究,我只能假设这与 Android 12 和可变性意图标志有关。这个问题的所有旧答案似乎都通过添加 FLAG_UPDATE_CURRENT
标志来解决。
我也试过同样的代码 运行 PendingIntent.FLAG_IMMUTABLE
但结果是一样的。
不确定这是否重要,但我正在使用 AlarmManager
来传送 PendingIntent
。
@ShlomiKatriel 在上面发表评论并向我指出类似问题后,我找到了解决方案。
发生这种情况的原因是因为Intent
不知道如何序列化和反序列化每种类型的对象。
就我而言,有问题的行是:
intent.putExtra(ARG_REMINDER_TYPE, type)
因为我试图作为额外传递的类型实际上是 enum
。令人困惑的是,如果单个序列化失败,它会丢失所有数据,而不仅仅是失败的数据。这就是为什么我的 ARG_DATE_TIME
也丢失了。
在我用原始类型替换枚举 extra 之后,它开始按预期工作,我也可以访问我的其他 extras。
我的 BroadcastReceiver
送货时没有收到 Intent
额外的东西。
下面是我如何创建 PendingIntent
private fun getPendingIntent(type: ReminderType, date: DateTime): PendingIntent {
val context = App.appContext
val intent = Intent(context, TimeBasedRemindersBroadcastReceiver::class.java)
intent.putExtra(ARG_REMINDER_TYPE, type)
intent.putExtra(ARG_DATE_TIME, date)
val intentFlags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
val requestCode = date.dayOfWeek * 100 + type.ordinal
return PendingIntent.getBroadcast(
context,
requestCode,
intent,
intentFlags
)
}
如您所见,一旦 Intent 被初始化,额外的内容就会被清楚地追加。当 BroadcastReceiver
被触发时,intent.extras
为空。
经过研究,我只能假设这与 Android 12 和可变性意图标志有关。这个问题的所有旧答案似乎都通过添加 FLAG_UPDATE_CURRENT
标志来解决。
我也试过同样的代码 运行 PendingIntent.FLAG_IMMUTABLE
但结果是一样的。
不确定这是否重要,但我正在使用 AlarmManager
来传送 PendingIntent
。
@ShlomiKatriel 在上面发表评论并向我指出类似问题后,我找到了解决方案。
发生这种情况的原因是因为Intent
不知道如何序列化和反序列化每种类型的对象。
就我而言,有问题的行是:
intent.putExtra(ARG_REMINDER_TYPE, type)
因为我试图作为额外传递的类型实际上是 enum
。令人困惑的是,如果单个序列化失败,它会丢失所有数据,而不仅仅是失败的数据。这就是为什么我的 ARG_DATE_TIME
也丢失了。
在我用原始类型替换枚举 extra 之后,它开始按预期工作,我也可以访问我的其他 extras。