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。