So zeigen Sie mehrere Benachrichtigungen in Android an


101

Ich erhalte nur eine Benachrichtigung und wenn eine weitere Benachrichtigung eingeht, ersetzt diese die vorherige und hier ist mein 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);

}

3
Gemäß offiziellem Dokument sollten Sie nicht mehrere Benachrichtigungen von einer App
anzeigen.

Antworten:


133

Ersetzen Sie einfach Ihre Leitung durch diese

 notificationManager.notify(Unique_Integer_Number, notification);

hoffe es wird dir helfen.


2
Was ist Unique_Integer_Numberin Ihrem Code .. und welchen Code sollte er ersetzen
Kartheeks

4
Eindeutige Ganzzahl bedeutet, dass Sie einen Ganzzahlwert festlegen müssen, der niemals wiederholt wird. Beispiel 0,1,2,3,4,5, .... !!!!
Sanket Shah

2
notificationManager.notify (1, Benachrichtigung); notificationManager.notify (2, Benachrichtigung);
Sanket Shah

1
Wie wird automatisch erhöht, wenn eine Benachrichtigung erfolgt?
Mitesh Shah

21
Generieren einer eindeutigen Ganzzahl: (int) ((neues Datum (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk

86

Einfache Benachrichtigungs-ID muss änderbar sein.

Erstellen Sie einfach eine Zufallszahl für notification_id.

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

oder Sie können diese Methode verwenden, um eine Zufallszahl zu erstellen, wie von tieorange angegeben (dies wird niemals wiederholt):

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

und ersetzen Sie diese Zeile, um einen Parameter für die Benachrichtigungs-ID hinzuzufügen und eine Zufallszahl zu generieren

    notificationManager.notify(m, notification);

8
Ein bisschen hackig und es besteht die Möglichkeit, dass Sie dieselbe Benachrichtigungs-ID erhalten, aber dies funktioniert, wenn Sie etwas sehr schnelles benötigen.
Muhammad Abdul-Rahim

1
Wenn ich das richtig sehe, funktioniert der Ansatz von tieorange nur mit Sekunden. Wenn Sie also mehrere Benachrichtigungen gleichzeitig haben, funktioniert dies nicht.
Testen

1
@testing ist richtig. Deshalb habe ich einen zweiten Schritt, m + = random.nextInt (100) + 1; Dies könnte ein Schritt mehr sein, aber es ist sicherer. Ich habe gesehen, dass die oben beschriebene Methode in den letzten Minuten einer Auktions- / Gebots-App fehlgeschlagen ist. Daher habe ich aus Sicherheitsgründen eine weitere Zeile hinzugefügt!
user3833732

27

Die Verwendung gemeinsamer Einstellungen hat bei mir funktioniert

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();

5
Dies ist eine ziemlich clevere Methode, wenn Sie auch jede gesendete Benachrichtigung im Auge behalten müssen. Wahrscheinlich eine der klügeren Antworten hier.
Muhammad Abdul-Rahim

12

Ersetzen Sie Ihre Leitung durch diese.

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

Wird das Entfernen der Benachrichtigung über einen bestimmten Nutzlasttyp mit diesem Ansatz nicht schwierig?
Sethuraman Srinivasan

8

Ich denke, dies wird jemandem helfen.
Im folgenden Code ist "not_nu" ein zufälliger Int. PendingIntent und Notification haben dieselbe ID.

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

Meine Benachrichtigungen stapeln sich noch nicht. Gibt es bestimmte Dinge, die ich tun muss, außer dem, was Sie hier zeigen?
Lion789

Was macht diese random.nextInt-Berechnung dort ... kannst du das erklären ??? 9999-1000 ???? Was ist das ...
Radu

@Radu, wie Sie im Code "notificationManager.notify (" sehen können, verwendet ein int (ID für Benachrichtigung) als ersten Parameter. Wenn dieses Int (ID) für eine neue Benachrichtigung identisch ist, ersetzt es das alte und zeigt das neue an. Wenn diese Int (ID) unterschiedlich ist, wird die neue Benachrichtigung separat behandelt und als Stapel angezeigt. Die ältere Benachrichtigung bleibt also erhalten. Um dies zu erreichen, erstellen wir eine zufällige Int und weisen sie als ID zu. "random.nextInt (9999 - 1000) + 1000; "mit diesem Code.
Muneef M

@ Lion789 Sie müssen nur eine andere ID für neue Benachrichtigungen verwenden, dann sollten die Benachrichtigungen gestapelt werden.
Muneef M

neuer NotificationCompat.Builder (this); ist in Android Oreo veraltet. Bitte überprüfen Sie die Dokumente und verwenden Sie die Notification Channel-Implementierung.
TapanHP

5

An der Stelle, an der uniqueIntNoeine eindeutige Ganzzahl wie folgt eingegeben wird:

mNotificationManager.notify(uniqueIntNo, builder.build());


3

Ich habe mein Problem so gelöst ...

/**
     * 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

Eine andere Möglichkeit besteht darin, das aktuelle Datum in lange zu konvertieren und nur die letzten 4 Ziffern zu verwenden. Es besteht eine hohe Wahrscheinlichkeit, dass die Nummer eindeutig ist.

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

Warum nur die letzten vier Ziffern verwenden und nicht die Datums- und Uhrzeitangabe selbst?
Muhammad Abdul-Rahim

4
Hier ist ein etwas kürzerer Code:int notificationId = System.currentTimeMillis()%10000;
bvk256

warum nur 4 Ziffern?
Pavel Biryukov

2

Sie müssen nur Ihre einzeiligen ändern von notificationManager.notify(0, notification);bis notificationManager.notify((int) System.currentTimeMillis(), notification);...

Dadurch wird die ID der Benachrichtigung geändert, sobald die neue Benachrichtigung angezeigt wird


1
notificationManager.notify(0, notification);

Setzen Sie diesen Code anstelle von 0

new Random().nextInt() 

Wie unten funktioniert es bei mir

notificationManager.notify(new Random().nextInt(), notification);

1
Aus der Bewertung: Hallo, bitte antworten Sie nicht nur mit dem Quellcode. Versuchen Sie, eine schöne Beschreibung der Funktionsweise Ihrer Lösung zu geben. Siehe: Wie schreibe ich eine gute Antwort? . Danke
sɐunıɔ ןɐ qɐp

0

Das Problem liegt bei Ihnen notificationId. Betrachten Sie es als Array-Index. Jedes Mal, wenn Sie Ihre Benachrichtigung aktualisieren, notificationIdist dies der Ort, an dem der Wert gespeichert wird. Da Sie Ihren int-Wert (in diesem Fall Ihren notificationId) nicht erhöhen , ersetzt dies immer den vorherigen. Ich denke, die beste Lösung besteht darin, sie zu erhöhen, sobald Sie eine Benachrichtigung aktualisiert haben. Und wenn Sie es dauerhaft halten möchten, können Sie den Wert Ihres notificationIdIn speichern sharedPreferences. Wann immer Sie zurückkommen, können Sie einfach den letzten ganzzahligen Wert ( notificationIdgespeichert in sharedPreferences) abrufen und verwenden.


0

Unten finden Sie den Code für die eindeutige Benachrichtigungs-ID:

//"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.

Zurücksetzen notificationIdin savedPreferencesan bestimmten Bereich , wie ich es bei 1000 tat haben also es irgendwelche Probleme in Zukunft nicht schaffen wird. Lassen Sie mich wissen, wenn Sie weitere Informationen oder Fragen benötigen. :) :)


Hallo, können Sie den vollständigen Code gut posten
?

0

Verwenden Sie die folgende Methode in Ihrem Code.

Methodenaufruf: -

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

Methode:-

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

-1

Ein einfacher Zähler kann Ihr Problem lösen.

private Integer notificationId = 0;

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

NotificationManager.notify(incrementNotificationId, notification);

-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());

-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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.