额外的未决意图会丢失

jon*_*ney 3 android broadcastreceiver alarmmanager kotlin

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

下面是我的代码

 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)
Run Code Online (Sandbox Code Playgroud)

广播接收器

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()

    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 5

您不能再将自定义对象放入传递给 的Bundlean 中的“extras”中。Android 框架尝试反序列化这些自定义对象并失败,这就是为什么您在警报触发时看不到自定义对象。IntentAlarmManagerBundle

这里有两种选择:

  1. 将数据放入 SQLite 数据库或文件中,而不是放在“extras”中。您可以将 ID 或其他一些唯一值放入“extras”中以帮助您识别数据,但它必须是基元(例如int)或String.
  2. 将自定义对象序列化(或转换)为byte数组或 aString并将其放入“extras”中。然后 Android 可以毫无问题地反序列化它。当警报触发时,您可以将byte数组转换String回自定义对象。