待定意图额外的丢失

时间:2018-03-02 16:49:47

标签: android kotlin broadcastreceiver alarmmanager

您好我正在尝试创建一个待定意图,其意图附加内容中包含枚举,通过警报管理器启动广播接收器,但是当我试图让枚举说它为空时,我的代码在广播接收器上崩溃了? / p>

以下是我的代码

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

    }
}

2 个答案:

答案 0 :(得分:1)

您无法再将自定义对象放入传递给Bundle的{​​{1}}中的“额外内容”Intent。 Android框架尝试反序列化这些自定义对象并失败,这就是警报触发时您不会在AlarmManager中看到自定义对象的原因。

以下是两种选择:

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

答案 1 :(得分:0)

您可能想尝试

PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)