一旦在我的代码中触发警报,有没有办法让 requestCode 脱离待处理的意图?
Posted
技术标签:
【中文标题】一旦在我的代码中触发警报,有没有办法让 requestCode 脱离待处理的意图?【英文标题】:Is there a way to get the requestCode out of a pending intent once an alarm is triggered in my code? 【发布时间】:2020-09-09 16:23:08 【问题描述】:我正在课堂上制作一个基本的 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)
有没有办法按照我的方式完成这项工作,或者我是否需要更改设置 Intent 的方式?
【问题讨论】:
【参考方案1】:回答你的问题
有没有办法让 requestCode 脱离待处理的意图 我的代码中触发了警报?
没有。您实际上并没有在您的BroadcastReceiver
中获得PendingIntent
,您只能获得由PendingIntent
包装的Intent
。所以requestCode
不会发送到onReceive()
。
正如其他人已经提到的那样,您可以通过将requestCode
放入Intent
作为“额外”来做到这一点。像这样:
val requestCode = newAlarmID.toInt()
val pi = PendingIntent.getBroadcast(this, requestCode,
Intent(intentName).putExtra("requestCode", requestCode),
PendingIntent.FLAG_UPDATE_CURRENT)
当警报触发时,从Intent
中的requestCode
获取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)
这将从Intent
中提取requestCode
并将其传递给您的handleAlarm()
方法。
注意:如果由于某种原因无法确定requestCode
,上述代码会将其设置为-1。
【讨论】:
以上是关于一旦在我的代码中触发警报,有没有办法让 requestCode 脱离待处理的意图?的主要内容,如果未能解决你的问题,请参考以下文章