Como exibir várias notificações no Android

103

Estou recebendo apenas uma notificação e se houver outra notificação, ela substituirá a anterior e aqui está o meu código

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
fonte
3
De acordo com o documento oficial, você não deve mostrar várias notificações de um aplicativo, você deve empilhar todas as notificações. Dê uma olhada: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

Respostas:

134

apenas substitua sua linha por esta

 notificationManager.notify(Unique_Integer_Number, notification);

espero que ajude você.

Sanket Shah
fonte
2
o que está Unique_Integer_Numberem seu código ... e qual código ele deve substituir
Kartheek
4
Um número inteiro único significa que você deve definir um valor inteiro que nunca será repetido. exemplo 0,1,2,3,4,5, .... !!!!
Sanket Shah
2
notificationManager.notify (1, notificação); notificationManager.notify (2, notificação);
Sanket Shah
1
Como irá incrementar automaticamente quando a notificação chegar ??
Mitesh Shah
21
gerando inteiro único: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Andrii Kovalchuk
87

O notification_id simples precisa ser alterável.

Basta criar um número aleatório para notification_id.

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

ou você pode usar este método para criar um número aleatório conforme informado por tieorange (isso nunca será repetido):

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

e substitua esta linha para adicionar parâmetro para id de notificação para gerar um número aleatório

    notificationManager.notify(m, notification);
sagar.android
fonte
8
Um pouco hacky e corre a possibilidade de você acabar com o mesmo id de notificação, mas funciona se você precisar de algo realmente rápido.
Muhammad Abdul-Rahim
1
Se eu vejo isso direito, o apporach de tieorange só funciona com segundos. Portanto, se você tiver várias notificações ao mesmo tempo, isso não funcionará.
teste em
1
@testing está certo. é por isso que tenho uma segunda etapa, m + = random.nextInt (100) + 1; isso pode ser um passo a mais, mas é mais seguro. Eu vi o método acima falhar nos últimos minutos de um aplicativo de leilão / lance. Por isso, acrescentei outra linha para segurança!
user3833732
27

Usar preferências compartilhadas funcionou para mim

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
fonte
5
Essa é uma maneira bastante inteligente de fazer isso se você também precisar controlar todas as notificações enviadas. Provavelmente uma das respostas mais inteligentes aqui.
Muhammad Abdul-Rahim
12

Substitua sua linha por esta.

notificationManager.notify((int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE), notification);
Tony Baby
fonte
A remoção da notificação de um determinado tipo de carga não fica difícil com essa abordagem?
Sethuraman Srinivasan
8

Acho que isso vai ajudar alguém ..
no código abaixo "not_nu" é um intent aleatório .. PendingIntent e Notification têm o mesmo ID .. de modo que em cada clique de notificação o intent irá direcionar para atividades diferentes ..

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
fonte
Minhas notificações não estão se acumulando ainda. Há alguma coisa específica que tenho que fazer além do que você mostra aqui?
Lion789
O que esse cálculo random.nextInt está fazendo aí ... você pode explicar ??? 9999-1000 ???? o que é isso ...
Radu
@Radu como você pode ver no código "notificationManager.notify (" leva um int (ID para notificação) como o primeiro parâmetro. Se este Int (ID) for o mesmo para a nova notificação, ele substituirá o antigo e mostrará o novo. se este Int (ID) for diferente, a nova notificação será tratada separadamente e mostrada como pilhas. Portanto, a notificação mais antiga permanece. e, para isso, estamos criando um int aleatório e atribuindo-o como ID. "random.nextInt (9999 - 1000) + 1000; "usando este código.
Muneef M
@ Lion789 você apenas tem que usar um ID diferente para novas notificações, então ele deve empilhar as notificações.
Muneef M
novo NotificationCompat.Builder (this); está obsoleto no Android Oreo, verifique a documentação e use a implementação do canal de notificação.
TapanHP
5

No lugar de uniqueIntNocolocar um número inteiro único como este:

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

Resolvi meu problema assim ...

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

Outra maneira de fazer isso é pegar a data atual e convertê-la em longa, basta pegar os últimos 4 dígitos. Existe uma grande probabilidade de que o número seja único.

    long time = new Date().getTime();
    String tmpStr = String.valueOf(time);
    String last4Str = tmpStr.substring(tmpStr.length() -5);
    int notificationId = Integer.valueOf(last4Str);
Vidyadhara
fonte
Por que usar apenas os últimos quatro dígitos e não a data e hora em si?
Muhammad Abdul-Rahim
4
Aqui está um código um pouco mais curto:int notificationId = System.currentTimeMillis()%10000;
bvk256
por que apenas 4 dígitos?
Pavel Biryukov
2

Você só precisa alterar sua linha de notificationManager.notify(0, notification);para notificationManager.notify((int) System.currentTimeMillis(), notification);...

Isso mudará o id da notificação sempre que a nova notificação for exibida

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

Coloque este código em vez de 0

new Random().nextInt() 

Como abaixo, funciona para mim

notificationManager.notify(new Random().nextInt(), notification);
Sameer Ahmed Mallah
fonte
1
Da avaliação: Olá, por favor, não responda apenas com o código-fonte. Tente fornecer uma boa descrição sobre como sua solução funciona. Veja: Como escrevo uma boa resposta? . Obrigado
sɐunıɔ ןɐ qɐp
0

O problema é com o seu notificationId. Pense nisso como um índice de array. Cada vez que você atualiza sua notificação, notificationIdé o lugar que leva para armazenar o valor. Como você não está incrementando seu valor int (neste caso, seu notificationId), ele sempre substitui o anterior. A melhor solução, eu acho, é incrementá-lo logo após atualizar uma notificação. E se quiser mantê-lo persistente, você pode armazenar o valor de seu notificationIdin sharedPreferences. Sempre que você voltar, você pode simplesmente pegar o último valor inteiro ( notificationIdarmazenado em sharedPreferences) e usá-lo.

androCoder-BD
fonte
0

Abaixo está o código para o ID de notificação exclusivo:

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

Reinicie notificationIdem savedPreferencesum intervalo específico como fiz em 1000. Portanto, não criará nenhum problema no futuro. Deixe-me saber se você precisar de mais informações detalhadas ou qualquer dúvida. :)

Gaurav Darji
fonte
Olá, você pode postar o código completo bem, sabemos que para gerar várias notificações precisa de um id único, mas depois de gerar também temos que cancelar essa notificação em particular .. há um problema para salvar e obter cada id único no meu caso, se você puder ajudar, por
favor
0

Use o seguinte método em seu código.

Chamada de método: -

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

Método:-

  *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
fonte
-1

Um simples contador pode resolver seu problema.

private Integer notificationId = 0;

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

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

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