我的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和mutability intent标志有关。所有对这个问题的旧答案似乎都通过添加FLAG_UPDATE_CURRENT
标志来解决这个问题。
我也尝试了相同的代码与PendingIntent.FLAG_IMMUTABLE
运行,但结果是相同的。
不确定是否重要,但我正在使用AlarmManager
来交付PendingIntent
。
@ShlomiKatriel在上面评论并向我指出了一个类似的问题后,我有了一个解决方案。
发生这种情况的原因是Intent
不知道如何序列化和反序列化每种类型的对象。
在我的例子中,有问题的行是:
intent.putExtra(ARG_REMINDER_TYPE, type)
因为我试图传递额外的类型实际上是一个enum
。使这非常令人困惑的是,如果单个序列化失败,它会丢失所有数据,而不仅仅是失败的数据。这就是为什么我的ARG_DATE_TIME
也丢失了。
在我用一个基本类型替换了enum extra之后,它开始像预期的那样工作,我也可以访问其他的extra了。