BroadcastReceiver意图交付,没有额外的



我的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了。

相关内容

  • 没有找到相关文章

最新更新