一旦在我的代码中触发了警报,是否有办法从未决意图中获取 requestCode?

Is there a way to get the requestCode out of a pending intent once an alarm is triggered in my code?

我正在 class 中制作一个基本的 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)

有没有办法按照我的方式完成这项工作,或者我是否需要更改设置 Intents 的方式?

回答你的问题

Is there a way to get the requestCode out of a pending intent once an alarm is triggered in my code?

没有。你实际上并没有在你的 BroadcastReceiver 中得到 PendingIntent,你只得到被 PendingIntent 包裹的 Intent。所以 requestCode 没有传送到 onReceive().


正如其他人已经提到的那样,您可以将 requestCode 作为 "extra" 放在 Intent 中。像这样:

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

当警报触发时,从 onReceive() 中的 Intent 中获取 requestCode,如下所示:

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

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

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