我在课堂上制作了一个基本的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)
是否有办法像以前那样进行这项工作,或者我需要更改设置意图的方式?
回答您的问题
是否有一种方法可以从挂起的意图中获取requestCode,我的代码中触发了警报?
没有您实际上并没有在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。