Android旧通知无效新

时间:2015-05-28 19:21:24

标签: android notifications android-pendingintent

我正在开发一款Android应用。它接收通知A,并在用户点击通知时显示内容(与A相关)。问题是:如果用户在收到多个旧通知时点击其中一个旧通知,则会显示与最新通知相关的内容,而不是自身。例如,在我收到A,B,C,D(A是最新的)通知后,如果我点击通知A,它会显示内容A,但如果我点击B(或C或D),它仍会显示内容A。

我用来推送通知的代码如下:



Intent intent = new Intent(this, MainActivity.class);// start the main activity
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(MainActivity.EXTRA_TITLE, title);
intent.putExtra(MainActivity.EXTRA_URL, url);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
  .setWhen(System.currentTimeMillis())
  .setTicker(title)
  .setContentTitle(title)
  .setContentText(beacon.getDetail())
  .setAutoCancel(true)
  .setOngoing(false) // if it is true, the user cannot dismiss it
  .setSmallIcon(R.drawable.ic_launcher)
  .setOnlyAlertOnce(true)
  .setDefaults(Notification.DEFAULT_ALL)
  .setLights(0xff00ff00, 1000, 300)
  .setSound(Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "6"))
  .setVibrate(new long[] {
    0, 100, 200, 300
  })
  //.addAction(0,"Cancel", dismissIntent)
  //.addAction(0,"Open App", pi)
  .build();
notification.contentIntent = pi;
notificationManager.notify(id, notification);




我不确定这是否是Android上的正常情况。如果不是,有人可以帮我解决吗?如果是正常情况,有人可以建议我实施上述要求的解决方案吗?提前谢谢。

编辑: 十分感谢大家。在你的帮助下,我发现了问题所在。根据{{​​3}},如果两个意图相同,除了他们的"额外的" s,并且他们相关的待定意图也是相同的,那么"两个" pendingintents实际上只是一个pendingintent,因为在创建新的pendingintent时会重用旧的pendingintent。为了实现这一点(实现我的要求),我需要通过修改它们的动作,数据,类型,类和类别来确保两个意图不一样,或者通过修改它们的请求来确保两个挂起的通信不一样码。就我而言,我选择了第二个解决方案:



PendingIntent pi = PendingIntent.getActivity(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);




我将通知的ID分配给相应的pendingintents的请求代码。尽管意图仍然是相同的(filterEquals),但是它们相应的待定任务是不同的,因为它们具有不同的请求代码。我希望显示不同的内容,不同通知的ID不同。

通过实验,它可以正常工作。

2 个答案:

答案 0 :(得分:2)

来自PendingIntent docs

  

重要的是要知道两个Intent何时被认为是相同的   用于检索PendingIntent。人们常犯的错误   make是用Intent创建多个PendingIntent对象   只有他们的"额外"内容,期待得到一个不同的   每次PendingIntent。这不会发生。意图的部分   用于匹配的是与之相同的   Intent.filterEquals。如果使用两个等效的Intent对象   根据Intent.filterEquals,您将获得相同的PendingIntent   对于他们两个。

     

有两种典型的方法可以解决这个问题。

     

如果您确实需要多个不同的PendingIntent对象,请执行此操作   同时(例如使用两个显示的通知   在同一时间),那么你需要确保有一些东西   将他们与不同的人联系起来是不同的   PendingIntents。这可以是所考虑的任何Intent属性   Intent.filterEquals,或提供给的不同请求代码整数   getActivity(Context,int,Intent,int),getActivities(Context,int,   Intent [],int),getBroadcast(Context,int,Intent,int)或   getService(Context,int,Intent,int)。

答案 1 :(得分:0)

试试这个,它将取代旧通知

notificationManager.notify(id, notification); <---make id the same integer for all notifications