Android: obtenir un identifiant unique de notification

J’ai un bloc for qui ressemble à ceci:

 for(int counter = 0; counter < sList.size(); counter++){ String s = sList.get(counter); Notification notification = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText(s).setSmallIcon(R.drawable.ic_launcher).setContentIntent(pendingIntent).build(); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(counter, notification); } 

Ce bloc est situé dans un service déclenché par un gestionnaire d’alarmes. Donc, ce bloc peut vraiment être exécuté plusieurs fois avant que l’utilisateur ne voie les notifications. Lorsque ce bloc est ré-exécuté lorsque quelque chose a été ajouté à la liste, il remplace les notifications en cours, car les identifiants de la notification sont les mêmes. Comment puis-je empêcher que cela se produise? Comment puis-je obtenir un identifiant unique à chaque fois? Ou est-il possible d’éviter la totalité de l’ID, comme de dire à Android qu’il doit montrer la notification de toute façon, quel que soit l’identifiant?

Merci d’avance!

Je suis sûr que vous ne devriez pas avoir autant de notifications à la fois pour l’utilisateur. Vous devez afficher une notification unique qui consolide les informations sur le groupe d’événements, comme le fait par exemple le client Gmail. Utilisez Notification.Builder à cette fin.

 NotificationCompat.Builder b = new NotificationCompat.Builder(c); b.setNumber(g_push.Counter) .setLargeIcon(BitmapFactory.decodeResource(c.getResources(), R.drawable.list_avatar)) .setSmallIcon(R.drawable.ic_stat_example) .setAutoCancel(true) .setContentTitle(pushCount > 1 ? c.getSsortingng(R.ssortingng.stat_messages_title) + pushCount : title) .setContentText(pushCount > 1 ? push.ProfileID : mess) .setWhen(g_push.Timestamp) .setContentIntent(PendingIntent.getActivity(c, 0, it, PendingIntent.FLAG_UPDATE_CURRENT)) .setDeleteIntent(PendingIntent.getBroadcast(c, 0, new Intent(ACTION_CLEAR_NOTIFICATION), PendingIntent.FLAG_CANCEL_CURRENT)) .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE) .setSound(Uri.parse(prefs.getSsortingng( SharedPreferencesID.PREFERENCE_ID_PUSH_SOUND_URI, "android.resource://ru.mail.mailapp/raw/new_message_bells"))); 

Si vous avez toujours besoin de recevoir beaucoup de notifications de la barre d’état, sauvegardez la dernière valeur de votre compteur quelque part et utilisez la boucle for comme ceci:

  int counter = loadLastCounterValue(); for(Ssortingng s : sList){ Notification notification = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText(s).setSmallIcon(R.drawable.ic_launcher).setContentIntent(pendingIntent).build(); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(++counter, notification); } saveCounter(counter); 

Mais comme je l’ai dit, je pense que c’est une mauvaise solution qui conduit à une mauvaise expérience utilisateur à partir de votre application.

 long time = new Date().getTime(); Ssortingng tmpStr = Ssortingng.valueOf(time); Ssortingng last4Str = tmpStr.subssortingng(tmpStr.length() - 5); int notificationId = Integer.valueOf(last4Str); notificationManager.notify(notificationId, notif); 

Il obtient l’heure système actuelle. Ensuite, je ne lis que les 4 derniers chiffres. Je l’utilise pour créer un identifiant unique chaque fois que la notification est affichée. Ainsi, la probabilité d’obtenir le même identifiant ou de réinitialiser l’identifiant de notification sera évitée.

vous pouvez simplement spécifier un identifiant dans le générateur de notification.
Même id = mise à jour de la notification
identifiant différent = nouvelle notification.

En outre, deux applications différentes peuvent utiliser le même identifiant de notification, cela générera 2 notifications différentes sans problème. le système regarde à la fois l’identifiant et l’application d’où il provient.