我在类里面制作了一个基本的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。