【问题标题】:Is there a way to get the requestCode out of a pending intent once an alarm is triggered in my code?一旦在我的代码中触发警报,有没有办法让 requestCode 脱离待处理的意图?
【发布时间】: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 的方式?

【问题讨论】:

    标签: android kotlin android-intent alarmmanager android-pendingintent


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多