web-dev-qa-db-fra.com

Comment afficher plusieurs notifications dans Android

Je ne reçois qu'une notification et s'il y a une autre notification qui vient, 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);

}
83
Kartheek s

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());
    }
3
Kartheek s

remplacez simplement votre ligne par cette 

 notificationManager.notify(Unique_Integer_Number, notification);

espérons que cela vous aidera.

109
Andrain

Notification_id simple doit être modifiable.

Il suffit de créer un nombre 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 se reproduira jamais):

    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);
66
sagar.android

Utiliser les 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();
27
vLopez

Remplacez votre ligne par ceci.

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);
8
Tony Baby

je suppose que cela aidera quelqu'un ..
dans le code ci-dessous "not_nu" est un entier aléatoire .. PendingIntent et Notification ont le même ID .. de sorte que sur chaque notification, l’intention sera 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;
}
8
Muneef M

À la place de uniqueIntNo, mettez un nombre entier unique comme ceci: 

mNotificationManager.notify(uniqueIntNo, builder.build());
5
Sachin Singh

Vous devez ajouter un identifiant unique à chacune des notifications afin qu'elles ne se combinent pas les unes aux autres. Vous pouvez utiliser ce lien pour votre référence: 

https://github.com/sanathe06/AndroidGuide/tree/master/ExampleCompatNotificationBuilder

3
arshu

Une autre façon de le faire est de prendre la date actuelle pour la convertir en long en prenant simplement les 4 derniers chiffres. Il y a une forte probabilité que ce nombre soit unique.

    long time = new Date().getTime();
    String tmpStr = String.valueOf(time);
    String last4Str = tmpStr.substring(tmpStr.length() -5);
    int notificationId = Integer.valueOf(last4Str);
3
Vidyadhara

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

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

0
Arun Sriramula
notificationManager.notify(0, notification);
putthis new Random().nextInt() in position of 0
like below it works for me
notificationManager.notify(new Random().nextInt(), notification);
0
Sameer Ahmed Mallah

Vous trouverez ci-dessous le code de l'identifiant de notification unique pass:

//"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éinitialisez notificationId dans savedPreferences à une plage spécifique, comme je l’ai fait à 1000. afin qu’il ne crée plus de problèmes à l’avenir ..__ Faites-moi savoir si vous souhaitez plus d’informations ou une requête. :)

0
Gaurav Darji

Le problème est avec votre notificationId. Pensez-le comme un index de tableau. Chaque fois que vous mettez à jour votre notification, la notificationId est l'endroit où stocker la valeur. Comme vous n’incrémentez pas votre valeur int (dans ce cas, votre notificationId), elle remplace toujours la valeur précédente. La meilleure solution, je pense, consiste à l'incrémenter juste après la mise à jour d'une notification. Et si vous souhaitez le garder persistant, vous pouvez alors stocker la valeur de votre notificationId dans sharedPreferences. Chaque fois que vous revenez, vous pouvez simplement récupérer la dernière valeur entière (notificationId stockée dans sharedPreferences) et l'utiliser.

0
androCoder-BD

Utilisez la méthode suivante dans votre code.

Méthode d'appel: -

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;
    }
0