我在类里面制作了一个基本的android / kotlin警报应用程序。触发警报后,我希望能够从SQLite数据库中删除该警报,或者如果它是重复发生的警报,则可以将其重置。对于这两种情况,我都需要来自pendingIntent的requestCode,因为我正在使用数据库中警报的主键作为requestCode。
我不是唯一想要此方法的人,解决方案似乎正在使用Intent.putExtras(),但我的意图不是这样设置的:

var intentName =  when (newAlarmFrequency){
                    "Once" -> "alarmTask"
                    "Daily" ->  "alarmTaskDaily"
                    "Weekly" -> "alarmTaskWeekly"
                    else -> null
                }

并像这样传递到pi中:
val  pi  = PendingIntent.getBroadcast(this, newAlarmID.toInt(), Intent(intentName), PendingIntent.FLAG_UPDATE_CURRENT)

稍后将这样处理:
val receiver = object: BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (intent?.action) {
                "alarmTask" ->   handleAlarm(0)
                "alarmTaskDaily" ->   handleAlarm(1)
                "alarmTaskWeekly" ->   handleAlarm(2)

            }
        }
    }

    val filter = IntentFilter().apply {
        addAction("alarmTask")
        addAction("alarmTaskDaily")
        addAction("alarmTaskWeekly")
    }
    registerReceiver(receiver, filter)

有没有办法像我已经做过的那样进行这项工作,还是需要更改设置意图的方式?

最佳答案

回答你的问题



不。您实际上并没有在PendingIntent中获得BroadcastReceiver,而仅获得了Intent包装的PendingIntent。因此requestCode不会传递到onReceive()

正如其他人已经提到的那样,您可以通过将requestCode放在Intent中作为“额外”来做到这一点。像这样:

val requestCode = newAlarmID.toInt()
val pi = PendingIntent.getBroadcast(this, requestCode,
        Intent(intentName).putExtra("requestCode", requestCode),
        PendingIntent.FLAG_UPDATE_CURRENT)

警报触发时,从requestCode中的Intent获取onReceive(),如下所示:
override fun onReceive(context: Context?, intent: Intent?) {
    val requestCode = intent?.getIntExtra("requestCode", -1) ?: -1
    when (intent?.action) {
        "alarmTask" ->   handleAlarm(0, requestCode)
        "alarmTaskDaily" ->   handleAlarm(1, requestCode)
        "alarmTaskWeekly" ->   handleAlarm(2, requestCode)
    }
}

这将从requestCode中提取Intent并将其传递给您的handleAlarm()方法。

注意:如果由于某种原因无法确定requestCode,则上述代码将其设置为-1。

10-08 02:50