一旦在我的代码中触发了警报,是否有办法从未决意图中获取 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。
我正在 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。