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 存储在哪里?
- 如何清除?
关于如何清除它,我的意思是删除所有当前制作的PendingIntents
和一些Random
作为requestCode
的方法,所以以明确的方式,我一次只能使用一个通知
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
有不同的项目
PendingIntent
s 存储在非持久存储中。当设备重新启动时,它们都消失了。
此外,如果您创建 PendingIntent
并将其放入 Notification
,一旦 Notification
消失(关闭、打开等),PendingIntent
不再使用,将被删除。
通常您不应为 requestCode
使用随机数,因为这不能保证唯一性。如果您希望同时存在许多 PendingIntent
,则需要找到一种方法使您的 PendingIntent
独一无二。
在我的项目中,我尝试了 PendingIntent
所以我创建了一些通知,通过点击
打开一个 activityIntent 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 存储在哪里?
- 如何清除?
关于如何清除它,我的意思是删除所有当前制作的PendingIntents
和一些Random
作为requestCode
的方法,所以以明确的方式,我一次只能使用一个通知
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
有不同的项目
PendingIntent
s 存储在非持久存储中。当设备重新启动时,它们都消失了。
此外,如果您创建 PendingIntent
并将其放入 Notification
,一旦 Notification
消失(关闭、打开等),PendingIntent
不再使用,将被删除。
通常您不应为 requestCode
使用随机数,因为这不能保证唯一性。如果您希望同时存在许多 PendingIntent
,则需要找到一种方法使您的 PendingIntent
独一无二。