【问题标题】:BroadcastReceiver Intent delivered without extrasBroadcastReceiver Intent 交付,无需额外内容
【发布时间】:2022-05-27 21:00:59
【问题描述】:

我的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 不幸的是没有。将 String 而不是 Serializable 放入 extras 是我在进行故障排除时尝试的第一件事。
  • @ShlomiKatriel 您的评论实际上最终帮助我找到了解决方案。当我最初使用原始类型进行故障排除时,我的附加功能仍然没有通过。只有在删除有问题的行之后它才开始工作。似乎只有一个失败的序列化就足以让 Intent 失去所有额外内容,而不仅仅是失败的那个。感谢您为我指明正确的方向!

标签: android broadcastreceiver alarmmanager android-pendingintent


【解决方案1】:

在@ShlomiKatriel 在上面发表评论并向我指出类似的问题之后,我找到了解决方案。

发生这种情况的原因是Intent 不知道如何序列化和反序列化每种类型的对象。

就我而言,有问题的行是:

intent.putExtra(ARG_REMINDER_TYPE, type)

因为我试图作为额外传递的类型实际上是enum。使这非常令人困惑的是,如果单个序列化失败,它会丢失所有数据,而不仅仅是失败的数据。这就是为什么我的ARG_DATE_TIME 也丢失了。

在我将 enum extra 替换为原始类型之后,它开始按预期工作,我也可以访问我的其他 extra。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2018-03-18
    • 2011-08-23
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多