PendingIntents 存储在哪里?使用的大陷阱

Where are stored PendingIntents? Big trap of using

在我的项目中,我尝试了 PendingIntent

的一些可能性和限制

所以我创建了一些通知,通过点击

打开一个 activity
Intent intent = new Intent(this, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(Constants.INTENT_ITEM_NAME, "ItemName");
intent.putExtra(Constants.INTENT_ITEM_ID, itemId);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
// properties set
;

notificationManager.notify(new Random().nextInt(10), notificationBuilder.build());

一开始一切都很好,直到我通过点击通知将其他项目显示在 NotificationActivity 中。

这里开始出现问题:在 NotificationActivity 中仍然显示上一个项目。

经过一番搜索后,可以通过以下方式解决:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

但是:如果我同时收到很多通知,那么我总是只会看到最后一项,PendingIntent 是为

创建的

getActivity的第二个参数是requestCode。所以当我将解决方案更新为

PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(1000), intent, PendingIntent.FLAG_UPDATE_CURRENT);

然后也支持很多项目,如果由于某种原因随机使我相同的数字,NotificationActivity中的内容将是相同的。

所以 99% 的解决方案是好的,是吗? 没有

回到第一个方法

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

如果我为意图设置 new extras -> old extras 将被读取。

换句话说:通过 new Random().nextInt(1000) 在 android 设备系统中的某处将存储到 1000 PendingIntents 用于其中一项活动我有永远

下面是问题

关于如何清除它,我的意思是删除所有当前制作的PendingIntents和一些Random作为requestCode的方法,所以以明确的方式,我一次只能使用一个通知

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

有不同的项目

PendingIntents 存储在非持久存储中。当设备重新启动时,它们都消失了。

此外,如果您创建 PendingIntent 并将其放入 Notification,一旦 Notification 消失(关闭、打开等),PendingIntent不再使用,将被删除。

通常您不应为 requestCode 使用随机数,因为这不能保证唯一性。如果您希望同时存在许多 PendingIntent,则需要找到一种方法使您的 PendingIntent 独一无二。