一旦在我的代码中触发警报,有没有办法让 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 脱离待处理的意图?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda超时时获取通知

未触发 Pinescript 警报

收到来自 Firebase 的通知时触发警报

当多个警报视图出现在同一个视图控制器中时,有没有办法交错?

无法让我的 if 语句使用 pytz 计时触发警报系统

C中的多个警报?