一旦在我的代码中触发了警报,是否有办法从挂起的意图中获取requestCode?

问题描述 投票:1回答:1

我在课堂上制作了一个基本的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)

是否有办法像以前那样进行这项工作,或者我需要更改设置意图的方式?

android kotlin android-intent alarmmanager android-pendingintent
1个回答
0
投票

回答您的问题

是否有一种方法可以从挂起的意图中获取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。

© www.soinside.com 2019 - 2024. All rights reserved.