每个通知都有自己的包含唯一数据的 PendingIntent

Posted

技术标签:

【中文标题】每个通知都有自己的包含唯一数据的 PendingIntent【英文标题】:Notifications each with their own PendingIntent containing unique data 【发布时间】:2019-07-23 19:01:55 【问题描述】:

我有一个名为sendNotification 的方法可以被多次调用。

private PendingIntent createNotificationIntent(Context context, String
type, int notificationId, String extra) 

   Intent notificationIntent = new Intent(this, ShimmyMobileActivity.class);
   notificationIntent.putExtra("com.****.****.action", type);
   notificationIntent.putExtra("com.****.****.notification_id",
notificationId);
   notificationIntent.putExtra("com.****.****.notification_extra",
extra);

   notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
         | Intent.FLAG_ACTIVITY_SINGLE_TOP);

   PendingIntent intent = PendingIntent.getActivity(this, 0,
         notificationIntent, PendingIntent.FLAG_IMMUTABLE);

   return intent;



private void sendNotification(int id, String message, String extra) 

   NotificationManager notificationManager = (NotificationManager) this
         .getSystemService(Context.NOTIFICATION_SERVICE);

   Notification.Builder builder = new
Notification.Builder(ShimmyMobileActivity.this);

   builder.setContentTitle("Shimmy Notification");
   builder.setContentText(message);
   builder.setSmallIcon(R.mipmap.ic_launcher);

   //builder.setDeleteIntent(this.createNotificationIntent(this,
"notification_delete", id, extra));
   builder.setContentIntent(this.createNotificationIntent(this,
"notification_clicked", id, extra));
   builder.setPriority(Notification.PRIORITY_MAX);

   if(this.preferences.getBoolean("vibrate", true)) 
      builder.setVibrate(new long[]500, 500);
           Vibrator vibrator = (Vibrator) this
.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(500);
       

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 

      if (this.channel == null) 

         this.channel = new NotificationChannel(this.channelId,
"ShimmyMobile Notifications", NotificationManager.IMPORTANCE_DEFAULT);
         notificationManager.createNotificationChannel(this.channel);
      

      builder.setChannelId(this.channelId);
   

   Notification notification = builder.build();
   notificationManager.notify(id, notification);


当用户选择通知时 我会在onResume 方法中舔取与通知关联的数据。

我在onResume做以下事情

if(action != null && action.equals("notification_clicked".toString())) 

         int notification_id =
this.getIntent().getIntExtra("com.****.****.notification_id",
-1);
         String extra = this.getIntent().getStringExtra("com.****.****.notification_extra");


问题是用户点击通知后,notification 和 notification_extra 数据总是属于错误的通知。

我认为是因为

PendingIntent 意图 = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

但我尝试了不同的标志,但没有成功。

如何创建许多附有 OWN PendingIntent 的通知?

谢谢

【问题讨论】:

不确定标志是否正常或有问题,但您总是使用相同的请求代码 (0) 来启动相同的操作,并且使用不同的附加项并不重要:您的 PendingIntents 都被认为是同样的PendingIntent,见docs 感谢请求代码解决了。 请回答您自己的问题并接受答案。这将帮助其他有同样问题的人,并从未回答的问题列表中删除该问题。 【参考方案1】:

我必须为每个通知发送一个唯一的整数到 PendingIntent。 上面我只是通过0

【讨论】:

以上是关于每个通知都有自己的包含唯一数据的 PendingIntent的主要内容,如果未能解决你的问题,请参考以下文章

如何根据数据库中的数据实现推送通知?

为每个小部件提供唯一数据

带有“null”PendingIntent 的通知

Laravel - 唯一规则验证 - getMessages 不存在

perl - 帮助修改代码以包含子例程的使用

分布式系统中生成全局ID的总结与思考