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

}
Kartheek s
quelle
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.

Sanket Shah
quelle
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);
sagar.android
quelle
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();
vLopez
quelle
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);
Tony Baby
quelle
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;
}
Muneef M.
quelle
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());
Sachin Singh
quelle
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());
    }
Kartheek s
quelle
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);
Vidyadhara
quelle
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

Arun Sriramula
quelle
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);
Sameer Ahmed Mallah
quelle
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.

androCoder-BD
quelle
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. :) :)

Gaurav Darji
quelle
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;
    }
Sreekanth Karumanaghat
quelle
-1

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

private Integer notificationId = 0;

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

NotificationManager.notify(incrementNotificationId, notification);
Nirfrea
quelle
-1
declare class member
static int i = 0;

mNotificationManager.notify(++i, mBuilder.build());
amar
quelle
-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
quelle