Android - 跟踪多个 PendingIntents 的正确方法是什么?
Android - What is the correct way of keeping track of multiple PendingIntents?
我将简要说明我需要实现的目标,我已将 PendingIntent
与 AlarmManager.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 如果所有参数都匹配
则令人兴奋的令牌
希望这对您有所帮助:)
我将简要说明我需要实现的目标,我已将 PendingIntent
与 AlarmManager.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 如果所有参数都匹配
则令人兴奋的令牌希望这对您有所帮助:)