Come visualizzare più notifiche in Android


103

Ricevo solo una notifica e se arriva un'altra notifica, sostituisce la precedente ed ecco il mio codice

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
Come da documento ufficiale, non dovresti mostrare più notifiche da un'unica app devi impilare tutte le notifiche ..
Dai

Risposte:


134

basta sostituire la riga con questa

 notificationManager.notify(Unique_Integer_Number, notification);

spero che ti possa aiutare.


2
cosa c'è Unique_Integer_Numbernel tuo codice .. e quale codice dovrebbe sostituire
Kartheek

4
Numero intero univoco significa che devi impostare un valore intero che non verrà mai ripetuto. esempio 0,1,2,3,4,5, .... !!!!
Sanket Shah

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

1
Come si incrementerà automaticamente quando arriva la notifica ??
Mitesh Shah

21
generazione di un numero intero univoco: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk

87

Il semplice notification_id deve essere modificabile.

Basta creare un numero casuale per notification_id.

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

oppure puoi usare questo metodo per creare un numero casuale come detto da tieorange (questo non verrà mai ripetuto):

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

e sostituire questa riga per aggiungere un parametro per l'ID di notifica per generare un numero casuale

    notificationManager.notify(m, notification);

8
Un po 'hacky e incorre nella possibilità che ti ritroverai con lo stesso ID di notifica, ma funziona se hai bisogno di qualcosa di veramente veloce.
Muhammad Abdul-Rahim

1
Se vedo bene, l'apporach da tieorange funziona solo con i secondi. Quindi, se hai più notifiche nello stesso secondo, questo non funzionerà.
test il

1
@testing è giusto. ecco perché ho un secondo passaggio, m + = random.nextInt (100) + 1; questo potrebbe essere un passo in più ma è più sicuro. Ho visto il metodo sopra riportato fallire negli ultimi minuti di un'app per aste / offerte. Quindi ho aggiunto un'altra linea per la sicurezza!
user3833732

27

L'utilizzo delle preferenze condivise ha funzionato per me

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
Questo è un modo abbastanza intelligente per farlo se è necessario tenere traccia anche di ogni notifica inviata. Probabilmente una delle risposte più intelligenti qui.
Muhammad Abdul-Rahim

12

Sostituisci la tua linea con questa.

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

La rimozione della notifica di un particolare tipo di payload non diventa difficile con questo approccio?
Sethuraman Srinivasan

8

Immagino che questo aiuterà qualcuno ..
nel codice sottostante "not_nu" è un int casuale .. PendingIntent e Notification hanno lo stesso ID .. in modo che ad ogni clic di notifica l'intento indirizzerà ad attività diverse ..

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

Le mie notifiche non si accumulano ancora, ci sono cose specifiche che devo fare oltre a quello che mostri qui?
Lion789

Cos'è quel calcolo random.nextInt che ci fa lì ... puoi spiegare ??? 9999-1000 ???? cos'è quello ...
Radu

@Radu come puoi vedere nel codice "notificationManager.notify (" prende un int (ID per la notifica) come primo parametro. Se questo Int (ID) è lo stesso per la nuova notifica, sostituirà il vecchio e mostrerà il nuovo. se questo Int (ID) è diverso, la nuova notifica viene trattata separatamente e viene mostrata come stack. quindi la notifica precedente rimane. e per ottenere ciò. stiamo creando un int casuale e assegnando come ID. "random.nextInt (9999 - 1000) + 1000; "utilizzando questo codice.
Muneef M

@ Lion789 devi solo usare un ID diverso per le nuove notifiche, quindi dovrebbe accumulare le notifiche.
Muneef M

new NotificationCompat.Builder (this); è deprecato in Android Oreo, controlla i documenti e utilizza l'implementazione del canale di notifica.
TapanHP

5

Al posto di uniqueIntNo inserire un numero intero univoco come questo:

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


3

Ho risolto il mio problema in questo modo ...

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

Un altro modo per farlo è prendere la data corrente per convertirla in long, semplicemente prendere le ultime 4 cifre. C'è un'alta probabilità che il numero sia unico.

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

Perché usare solo le ultime quattro cifre e non il datetime stesso?
Muhammad Abdul-Rahim

4
Ecco un codice un po 'più breve:int notificationId = System.currentTimeMillis()%10000;
bvk256

perché solo 4 cifre?
Pavel Biryukov

2

Hai solo bisogno di cambiare la tua riga da notificationManager.notify(0, notification);a notificationManager.notify((int) System.currentTimeMillis(), notification);...

Questo cambierà l'id della notifica ogni volta che apparirà la nuova notifica


1
notificationManager.notify(0, notification);

Metti questo codice invece di 0

new Random().nextInt() 

Come sotto funziona per me

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

1
Dalla recensione: Ciao, per favore non rispondere solo con il codice sorgente. Prova a fornire una bella descrizione su come funziona la tua soluzione. Vedi: come scrivo una buona risposta? . Grazie
sɐunıɔ ןɐ qɐp

0

Il problema è con il tuo notificationId. Pensalo come un indice di matrice. Ogni volta che aggiorni la notifica, notificationIdè il posto che serve per memorizzare il valore. Poiché non stai incrementando il tuo valore int (in questo caso, il tuo notificationId), questo sostituisce sempre quello precedente. La soluzione migliore immagino sia incrementarlo subito dopo aver aggiornato una notifica. E se vuoi mantenerlo persistente, puoi memorizzare il valore del tuo notificationIdin sharedPreferences. Ogni volta che torni, puoi semplicemente prendere l'ultimo valore intero ( notificationIdmemorizzato in sharedPreferences) e usarlo.


0

Di seguito è riportato il codice per l'ID di notifica univoco del passaggio:

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

Ripristina notificationIdin savedPreferencesa distanza specifico come ho lo ha fatto al 1000. Quindi non creerà problemi in futuro. Fammi sapere se hai bisogno di maggiori informazioni dettagliate o qualsiasi domanda. :)


ciao puoi pubblicare il codice completo, sappiamo bene che per generare più notifiche è necessario un ID univoco, ma dopo la generazione dobbiamo anche annullare quella particolare notifica .. c'è un problema per salvare e ottenere ogni ID univoco nel mio caso se puoi aiutare pls
Jayman Jani

0

Usa il metodo seguente nel tuo codice.

Chiamata del metodo: -

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

Metodo:-

  *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

Un semplice contatore può risolvere il tuo problema.

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.