【问题标题】:Android - What is the correct way of keeping track of multiple PendingIntents?Android - 跟踪多个 PendingIntent 的正确方法是什么?
【发布时间】:2018-05-02 20:50:34
【问题描述】:

我将简要解释我需要实现的目标,我使用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)

正如您现在所看到的,我在 PendingIntent.getBroadcast() 中将 549078 强制为 resultCode

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

【问题讨论】:

  • “结果代码”是从启动活动中返回的结果。我假设您的意思是待处理的意图请求代码。您可能需要相应地更新您的问题。
  • @JeffreyBlattman 是的,你说得对,我的意思是请求代码,会更新问题

标签: android push-notification kotlin android-pendingintent


【解决方案1】:

无法在AlarmManager 中查询PendingIntents。您必须存储resultCode 和其他信息以重新创建PendingIntent 以便将其删除。

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

how to cancel PendingIntent

请参阅How does android compare pending intents,详细了解在比较删除意图时哪些字段很重要。

【讨论】:

  • 好的,我明白了,我应该只使用增量请求代码还是应该找到一些标准并从那里构建它?
  • 如果对您的应用有意义,增量请求代码就可以了。如果您有一些始终相同的警报,您可以为它们使用相同的代码,这样只有您才能确保一次只能出现一个该类型的警报。
  • 一件事,如果你使用 Fragments 代码必须低于 65535 见stackoverflow.com/questions/33331073/…
  • 我会记住这一点并在明天实施,非常感谢
  • 好的,我找到了一种方法,可以为每个通知设置一个唯一的requestCode,我需要存储的“其他信息”是什么?现在非常了解如何取消意图
【解决方案2】:

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

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

2) 我从应用程序数据库的主要活动的onCreate() 中获取此变量的值。

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

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

4) 在我的情况下,我在名为 requestCode 的警报类中添加了一个新字段,因此我可以跟踪哪个请求代码是哪个警报,因为我已经将警报保存在我的数据库中,对于您的情况,我不确定您的应用程序到底如何,但我想您需要找到一种方法来为每个警报存储此值。

我不确定这是否会很有帮助,因为我不确定您是否为您的应用程序使用数据库,但我建议您考虑创建一个数据库,如果您不关心拥有您的应用程序,甚至是本地数据库服务器上的数据(你可以使用 Room Library,它非常简单,这里有一个链接 https://developer.android.com/topic/libraries/architecture/room,因为我相信从长远来看这肯定会给你带来很多问题,因为当你启动一个 PendingIntent 时,系统并没有真正创建一个新的 PendingIntent,如果所有参数都匹配,它会返回令人兴奋的令牌

希望这会有所帮助:)

【讨论】:

  • 如果你的进程被杀死,那将会失败。您将失去静态计数器。如果您从不读取它,为什么要将值写入数据库也不清楚。
  • 正是出于这个原因,我将它保存到我的数据库中,因为我从数据库onCreate() 中获取了此计数器的值(如步骤2 中所述)。因此,当我的进程被终止时,重新启动时,该值将从数据库中检索到它具有的最后一个值,并且我将从那里再次增加,而不是从头开始。同样正如另一个答案中提到的,SharedPreferences 也应该是存储它的好方法。
  • 为什么不使用一种方法来访问值?
  • 我不确定你的意思?你能澄清一下吗? @JeffreyBlattman
  • 是的,现在我明白了。好吧,我实际上并没有在启动时手动取值,我只是在 Firebase ChildListener 中的 onChildAdded 方法中分配它,但我正在考虑将它移动到本地,因为我开始意识到它可能会在以后产生错误。不过感谢您的提示,感谢:)
猜你喜欢
  • 2012-11-08
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多