Comment afficher plusieurs notifications sur Android

103

Je ne reçois qu'une seule notification et s'il y a une autre notification, elle remplace la précédente et voici mon code

private static void generateNotification(Context context, String message,
        String key) {
    int icon = R.drawable.ic_launcher;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, message, when);

    String title = context.getString(R.string.app_name);

    Intent notificationIntent = new Intent(context,
            FragmentOpenActivity.class);
    notificationIntent.putExtra(key, key);
    // set intent so it does not start a new activity
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent = PendingIntent.getActivity(context, 0,
            notificationIntent, 0);
    notification.setLatestEventInfo(context, title, message, intent);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;

    notification.defaults |= Notification.DEFAULT_SOUND;

    // notification.sound = Uri.parse("android.resource://" +
    // context.getPackageName() + "your_sound_file_name.mp3");
    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notificationManager.notify(0, notification);

}
Kartheek s
la source
3
Selon le document officiel, vous ne devez pas afficher plusieurs notifications d'une application, vous devez empiler toutes les notifications. Jetez un œil: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

Réponses:

134

remplacez simplement votre ligne par ceci

 notificationManager.notify(Unique_Integer_Number, notification);

j'espère que cela vous aidera.

Sanket Shah
la source
2
ce qui est Unique_Integer_Numberdans votre code .. et quel code il devrait remplacer
Kartheek s
4
Un nombre entier unique signifie que vous devez définir une valeur entière qui ne sera jamais répétée. exemple 0,1,2,3,4,5, .... !!!!
Sanket Shah
2
notificationManager.notify (1, notification); notificationManager.notify (2, notification);
Sanket Shah
1
Comment s'incrémentera-t-il automatiquement lorsque la notification arrive?
Mitesh Shah
21
générer un entier unique: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk
87

La notification_id simple doit être modifiable.

Créez simplement un numéro aléatoire pour notification_id.

    Random random = new Random();
    int m = random.nextInt(9999 - 1000) + 1000;

ou vous pouvez utiliser cette méthode pour créer un nombre aléatoire comme indiqué par tieorange (cela ne sera jamais répété):

    int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);

et remplacez cette ligne pour ajouter un paramètre pour l'ID de notification afin de générer un nombre aléatoire

    notificationManager.notify(m, notification);
sagar.android
la source
8
Un peu piraté et se heurte à la possibilité que vous vous retrouviez avec le même identifiant de notification, mais cela fonctionne si vous avez besoin de quelque chose de très rapide.
Muhammad Abdul-Rahim
1
Si je vois cela bien, l'approche de tieorange ne fonctionne qu'avec des secondes. Donc, si vous avez plusieurs notifications à la même seconde, cela ne fonctionnera pas.
test le
1
@testing a raison. c'est pourquoi j'ai une 2ème étape, m + = random.nextInt (100) + 1; cela pourrait être un pas de plus, mais c'est plus sûr. J'ai vu la méthode ci-dessus échouer dans les dernières minutes d'une application d'enchères / enchères. Par conséquent, j'ai ajouté une autre ligne pour la sécurité!
user3833732
27

L'utilisation des préférences partagées a fonctionné pour moi

SharedPreferences prefs = getSharedPreferences(Activity.class.getSimpleName(), Context.MODE_PRIVATE);
int notificationNumber = prefs.getInt("notificationNumber", 0);
...

notificationManager.notify(notificationNumber , notification);
SharedPreferences.Editor editor = prefs.edit();
notificationNumber++;
editor.putInt("notificationNumber", notificationNumber);
editor.commit();
vLopez
la source
5
C'est une façon assez intelligente de le faire si vous devez également garder une trace de chaque notification envoyée. Probablement l'une des réponses les plus intelligentes ici.
Muhammad Abdul-Rahim
12

Remplacez votre ligne par ceci.

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);
Tony bébé
la source
La suppression de la notification d'un type de charge utile particulier n'est-elle pas difficile avec cette approche?
Sethuraman Srinivasan le
8

Je suppose que cela aidera quelqu'un ..
dans le code ci-dessous "not_nu" est un int aléatoire. PendingIntent et Notification ont le même ID .. de sorte que sur chaque notification, cliquez sur l'intention dirigée vers une activité différente.

private void sendNotification(String message,String title,JSONObject extras) throws JSONException {
   String id = extras.getString("actionParam");
    Log.e("gcm","id  = "+id);
    Intent intent = new Intent(this, OrderDetailActivty.class);
    intent.putExtra("id", id);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    final int not_nu=generateRandom();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, not_nu /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_cart_red)
            .setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

    notificationManager.notify(not_nu /* ID of notification */, notificationBuilder.build());
}
public int generateRandom(){
    Random random = new Random();
    return random.nextInt(9999 - 1000) + 1000;
}
Muneef M
la source
Mes notifications ne s'empilent pas encore, y a-t-il des choses spécifiques que je dois faire en plus de ce que vous montrez ici?
Lion789
Que fait ce calcul random.nextInt là-bas ... pouvez-vous expliquer ??? 9999-1000 ???? qu'est-ce que c'est ...
Radu
@Radu comme vous pouvez le voir dans le code "notificationManager.notify (" prend un int (ID pour notification) comme premier paramètre. Si cet Int (ID) est le même pour la nouvelle notification, il remplacera l'ancien et affichera le nouveau. si cet Int (ID) est différent, la nouvelle notification est traitée séparément et s'affiche comme des piles. Ainsi, l'ancienne notification reste. et pour ce faire. nous créons un int aléatoire et l'attribuons comme ID. "random.nextInt (9999 - 1000) + 1000; "en utilisant ce code.
Muneef M
@ Lion789, il vous suffit d'utiliser un ID différent pour les nouvelles notifications, puis il devrait empiler les notifications.
Muneef M
nouveau NotificationCompat.Builder (this); est obsolète dans Android Oreo, veuillez consulter la documentation et utiliser l'implémentation du canal de notification.
TapanHP
5

À la place de uniqueIntNomettre un nombre entier unique comme ceci:

mNotificationManager.notify(uniqueIntNo, builder.build());
Sachin Singh
la source
3

J'ai résolu mon problème comme ça ...

/**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message,
            String keys, String msgId, String branchId) {
        int icon = R.drawable.ic_launcher;
        long when = System.currentTimeMillis();
        NotificationCompat.Builder nBuilder;
        Uri alarmSound = RingtoneManager
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        nBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Smart Share - " + keys)
                .setLights(Color.BLUE, 500, 500).setContentText(message)
                .setAutoCancel(true).setTicker("Notification from smartshare")
                .setVibrate(new long[] { 100, 250, 100, 250, 100, 250 })
                .setSound(alarmSound);
        String consumerid = null;
        Integer position = null;
        Intent resultIntent = null;
        if (consumerid != null) {
            if (msgId != null && !msgId.equalsIgnoreCase("")) {
                if (key != null && key.equalsIgnoreCase("Yo! Matter")) {
                    ViewYoDataBase db_yo = new ViewYoDataBase(context);
                    position = db_yo.getPosition(msgId);
                    if (position != null) {
                        resultIntent = new Intent(context,
                                YoDetailActivity.class);
                        resultIntent.putExtra("id", Integer.parseInt(msgId));
                        resultIntent.putExtra("position", position);
                        resultIntent.putExtra("notRefresh", "notRefresh");
                    } else {
                        resultIntent = new Intent(context,
                                FragmentChangeActivity.class);
                        resultIntent.putExtra(key, key);
                    }
                } else if (key != null && key.equalsIgnoreCase("Message")) {
                    resultIntent = new Intent(context,
                            FragmentChangeActivity.class);
                    resultIntent.putExtra(key, key);
                }.
.
.
.
.
.
            } else {
                resultIntent = new Intent(context, FragmentChangeActivity.class);
                resultIntent.putExtra(key, key);
            }
        } else {
            resultIntent = new Intent(context, MainLoginSignUpActivity.class);
        }
        PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
                notify_no, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        if (notify_no < 9) {
            notify_no = notify_no + 1;
        } else {
            notify_no = 0;
        }
        nBuilder.setContentIntent(resultPendingIntent);
        NotificationManager nNotifyMgr = (NotificationManager) context
                .getSystemService(context.NOTIFICATION_SERVICE);
        nNotifyMgr.notify(notify_no + 2, nBuilder.build());
    }
Kartheek s
la source
3

Une autre façon de le faire est de prendre la date actuelle, de la convertir en longue, il suffit de prendre les 4 derniers chiffres. Il y a une forte probabilité que le numéro soit unique.

    long time = new Date().getTime();
    String tmpStr = String.valueOf(time);
    String last4Str = tmpStr.substring(tmpStr.length() -5);
    int notificationId = Integer.valueOf(last4Str);
Vidyadhara
la source
Pourquoi n'utiliser que les quatre derniers chiffres et non la date / heure elle-même?
Muhammad Abdul-Rahim
4
Voici un code un peu plus court:int notificationId = System.currentTimeMillis()%10000;
bvk256
pourquoi seulement 4 chiffres?
Pavel Biryukov
2

Il vous suffit de changer votre ligne unique de notificationManager.notify(0, notification);à notificationManager.notify((int) System.currentTimeMillis(), notification);...

Cela changera l'identifiant de la notification chaque fois que la nouvelle notification apparaîtra

Arun Sriramula
la source
1
notificationManager.notify(0, notification);

Mettez ce code au lieu de 0

new Random().nextInt() 

Comme ci-dessous ça marche pour moi

notificationManager.notify(new Random().nextInt(), notification);
Sameer Ahmed Mallah
la source
1
De l'avis: Bonjour, ne répondez pas uniquement avec le code source. Essayez de fournir une belle description du fonctionnement de votre solution. Voir: Comment rédiger une bonne réponse? . Merci
sɐunıɔ ןɐ qɐp
0

Le problème vient de votre notificationId. Considérez-le comme un index de tableau. Chaque fois que vous mettez à jour votre notification, notificationIdc'est l'endroit où la valeur est stockée. Comme vous n'incrémentez pas votre valeur int (dans ce cas, votre notificationId), cela remplace toujours la précédente. La meilleure solution, je suppose, est de l'incrémenter juste après la mise à jour d'une notification. Et si vous voulez le garder persistant, vous pouvez stocker la valeur de votre notificationIdin sharedPreferences. Chaque fois que vous revenez, vous pouvez simplement saisir la dernière valeur entière ( notificationIdstockée dans sharedPreferences) et l'utiliser.

androCoder-BD
la source
0

Voici le code pour passer l'identifiant de notification unique:

//"CommonUtilities.getValudeFromOreference" is the method created by me to get value from savedPreferences.
String notificationId = CommonUtilities.getValueFromPreference(context, Global.NOTIFICATION_ID, "0");
int notificationIdinInt = Integer.parseInt(notificationId);

notificationManager.notify(notificationIdinInt, notification);

// will increment notification id for uniqueness
notificationIdinInt = notificationIdinInt + 1;
CommonUtilities.saveValueToPreference(context, Global.NOTIFICATION_ID, notificationIdinInt + "");
//Above "CommonUtilities.saveValueToPreference" is the method created by me to save new value in savePreferences.

Réinitialiser notificationIddans savedPreferencesà courte portée spécifique comme je l' ai fait à ce 1000. Donc , il ne crée pas de problèmes à l' avenir. Faites-moi savoir si vous avez besoin d'informations plus détaillées ou de toute requête. :)

Gaurav Darji
la source
bonjour pouvez-vous poster le code complet bien nous savons que générer plusieurs notifications nécessitent un identifiant unique, mais après générer, nous devons également annuler cette notification particulière .. il y a un problème pour enregistrer et obtenir chaque identifiant unique dans mon cas si vous pouvez aider pls
Jayman Jani
0

Utilisez la méthode suivante dans votre code.

Appel de méthode: -

notificationManager.notify(getCurrentNotificationId(getApplicationContext()), notification);

Méthode:-

  *Returns a unique notification id.
         */

        public static int getCurrentNotificationId(Context iContext){

            NOTIFICATION_ID_UPPER_LIMIT = 30000; // Arbitrary number.

            NOTIFICATION_ID_LOWER_LIMIT = 0;
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(iContext);
        int previousTokenId= sharedPreferences.getInt("currentNotificationTokenId", 0);

        int currentTokenId= previousTokenId+1;

        SharedPreferences.Editor editor= sharedPreferences.edit();

        if(currentTokenId<NOTIFICATION_ID_UPPER_LIMIT) {

            editor.putInt("currentNotificationTokenId", currentTokenId); // }
        }else{
            //If reaches the limit reset to lower limit..
            editor.putInt("currentNotificationTokenId", NOTIFICATION_ID_LOWER_LIMIT);
        }

        editor.commit();

        return currentTokenId;
    }
Sreekanth Karumanaghat
la source
-1

Un simple compteur peut résoudre votre problème.

private Integer notificationId = 0;

private Integer incrementNotificationId() {
   return notificationId++;
}

NotificationManager.notify(incrementNotificationId, notification);
nirfrea
la source
-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());
amar
la source
-1
val notifyIdLong = ((Date().time / 1000L) % Integer.MAX_VALUE)
var notifyIdInteger = notifyIdLong.toInt()
if (notifyIdInteger < 0) notifyIdInteger = -1  * notifyIdInteger // if it's -ve change to positive
notificationManager.notify(notifyIdInteger, mBuilder.build())
log.d(TAG,"notifyId = $notifyIdInteger")
EdgeDev
la source