嗨,我正在尝试创建一个未完成的意图,该意图的意图额外内容中包含一个枚举,它通过警报管理器启动广播接收器,但是当我尝试让该枚举说它为null时,我的代码在广播接收器上崩溃了?

这是我的下面的代码

 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中的自定义对象放入“extras” AlarmManager中。 Android框架尝试反序列化这些自定义对象并失败,这就是为什么在警报触发时您不会在Bundle中看到自定义对象的原因。

这里有两种选择:

  • 将数据放在SQLite数据库或文件中,而不放在“extras”中。您可以将ID或其他一些唯一值放入“extras”中,以帮助您识别数据,但是它必须是原始类型(例如int)或String
  • 将自定义对象序列化(或转换)为byte数组或String,并将其放入“extras”中。然后,Android可以对此进行反序列化而不会出现问题。警报触发时,可以将byte数组或String转换回自定义对象。
  • 09-30 14:20
    查看更多