android - 额外的未决 Intent 丢失

标签 android kotlin broadcastreceiver alarmmanager

嗨,我正在尝试创建一个挂起的 Intent ,其 Intent 附加内容中包含一个枚举,通过警报管理器启动广播接收器,但是当我试图让枚举说它为空时,我的代码在广播接收器上崩溃?

这是我下面的代码

 val calendar = Calendar.getInstance()
        calendar.timeInMillis = System.currentTimeMillis()

        val intent = Intent(context, ClearDataReceiver::class.java)
        intent.action = "clear data"
        intent.putExtra(ClearDataReceiver.DATA_TYPE_EXTRA, DataType.CUSTOMER_DETAILS )
        val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, 60 * 1, pendingIntent)

广播接收器
override fun onReceive(context: Context?, intent: Intent?) {
    super.onReceive(context, intent)

    var bundle = intent!!.extras

    val dataType = bundle.getSerializable(DATA_TYPE_EXTRA) as DataType
    when(dataType){
        DataType.BALANCE -> storage.clearCurrentBalance()
        DataType.CARD_NUMBER -> storage.clearardNumber()
        DataType.CUSTOMER_DETAILS -> storage.clearUserDetails()

    }
}

最佳答案

您不能再将自定义对象放入“附加”BundleIntent你传递给 AlarmManager . Android 框架尝试反序列化这些自定义对象并失败,这就是您在 Bundle 中看不到自定义对象的原因。当警报触发时。

这里有 2 个备选方案:

  • 将数据放在 SQLite 数据库或文件中,而不是放在“附加”中。您可以将 ID 或其他一些唯一值放入“附加项”以帮助您识别数据,但它必须是原语(如 int )或 String .
  • 将自定义对象序列化(或转换)为 byte数组或 String并将其放在“附加”中。然后,Android 可以毫无问题地反序列化它。当您的警报触发时,您可以转换 byte数组或 String回到您的自定义对象。
  • 关于android - 额外的未决 Intent 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073675/

    相关文章:

    java - 如何使 Android 中的 ListView 中的单元格在被触​​摸时垂直扩展和收缩?

    Android studio build 在 buildtoolsversion 29.0.2 上在 Windows 上提供 Unresolved reference 错误(适用于 mac)

    java - 如何设置 TextView 在 Activity 中可见而不是在自定义广播接收器类中?

    kotlin - "Property must be initialized or be abstract"in init block 抛出异常

    android - kotlin 中的 android 与 USB 通信的问题

    android - 哪种方法我应该采用 1 个接收器和 10 个滤波器或 10 个接收器和 1 个滤波器

    android - Wifi Broadcastreceiver onreceive

    java - 为什么android SQLite可以将 double 值(java 8字节)存储到浮点列中

    Android 谷歌地图图标

    android - 与 Android 上的加密相比,解密要慢得多