Android - 跟踪多个 PendingIntents 的正确方法是什么?

Android - What is the correct way of keeping track of multiple PendingIntents?

我将简要说明我需要实现的目标,我已将 PendingIntentAlarmManager.setRepeating() 结合使用,每周通知用户。

val notificationAlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val notificationIntent = Intent(this, ReminderBroadcastReceiver::class.java)
val pendingNotificationIntent = PendingIntent.getBroadcast(this, 549078, notificationIntent,
        PendingIntent.FLAG_UPDATE_CURRENT)
 myCalendar.set(Calendar.HOUR_OF_DAY, 10)
 notificationAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, myCalendar.timeInMillis, notificationOffset(sub.cycle),
                    pendingNotificationIntent)

如你所见,我将 549078 强制设置为 PendingIntent.getBroadcast() 中的 resultCode

区分结果代码的正确方法是什么,这样我不仅可以有多个通知(因为创建新的结果代码时会覆盖相同的结果代码),而且我还需要一种方法来跟踪结果代码,因为我可能想在显示之前删除它。

无法为 PendingIntent 查询 AlarmManager。您必须存储 resultCode 和其他信息以重新创建 PendingIntent 才能将其删除。

例如在 SharedPreferences 或像 SqliteDB 或 Room 这样的数据库中。然后您可以重新创建 PendingIntent 以取消它。

参见how to cancel PendingIntent

有关比较删除意图时哪些字段重要的详细信息,请参阅

我遇到了同样的问题,我的做法如下:

1) 我创建了一个 int 字段,我在主 activity 中将其创建为静态字段。

2) 我从应用程序数据库activity 的onCreate() 中获取这个变量的值。

3) 每次我创建一个新的警报时,我都会通过如下函数获得一个新的请求代码:

public static int getRequestCode() {
    int temp = this.requestCode++;
    // Update the database value with the current requestCode value
    return temp;
}

4) 在我的例子中,我在警报 class 中添加了一个名为 requestCode 的新字段,这样我就可以跟踪哪个请求代码对应哪个警报,因为我已经将警报保存在我的数据库中,因为你的情况我不确定你的应用程序到底有多好,但我想你需要找到一种方法来为每个警报存储这个值。

我不确定这是否会有帮助,因为我不确定您是否正在为您的应用程序使用数据库,但我建议您考虑创建一个,如果您不关心的话,即使是本地数据库将您的数据保存在服务器上 (您可以为此使用 Room Library,这非常简单,这里是 link https://developer.android.com/topic/libraries/architecture/room,因为我相信这肯定会在长期 运行 上给你带来很多问题,因为当你启动一个 PendingIntent 时系统并没有真正创建一个新的 PendingIntent,它 returns 如果所有参数都匹配

则令人兴奋的令牌

希望这对您有所帮助:)