Как отобразить несколько уведомлений в android


103

Я получаю только одно уведомление, и если приходит другое уведомление, оно заменяет предыдущее, и вот мой код

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
Согласно официальному документу, вы не должны показывать несколько уведомлений из одного приложения, вы должны складывать все уведомления .. Взгляните: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

Ответы:


134

просто замените свою строку на это

 notificationManager.notify(Unique_Integer_Number, notification);

надеюсь, это поможет вам.


2
что Unique_Integer_Numberв вашем коде .. и какой код он должен заменить
Kartheek

4
Уникальное целое число означает, что вы должны установить целое значение, которое никогда не будет повторяться. пример 0,1,2,3,4,5, .... !!!!
Санкет Шах 07

2
notificationManager.notify (1, уведомление); notificationManager.notify (2, уведомление);
Санкет Шах

1
Как будет увеличиваться автоматически при получении уведомления ??
Mitesh Shah

21
создание уникального целого числа: (int) ((new Date (). getTime () / 1000L)% Integer.MAX_VALUE);
Андрей Ковальчук

87

Необходимо изменить простой идентификатор уведомления.

Просто создайте случайное число для notification_id.

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

или вы можете использовать этот метод для создания случайного числа, как указано в tieorange (это никогда не повторится):

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

и замените эту строку, чтобы добавить параметр для идентификатора уведомления для генерации случайного числа

    notificationManager.notify(m, notification);

8
Немного хакерский и есть вероятность того, что вы получите тот же идентификатор уведомления, но это работает, если вам нужно что-то действительно быстрое.
Мухаммад Абдул-Рахим

1
Если я правильно понимаю, то аппорач от tieorange работает только с секундами. Так что, если у вас есть несколько уведомлений одновременно, это не сработает.
тестирование

1
@testing прав. вот почему у меня есть 2-й шаг, m + = random.nextInt (100) + 1; это может быть на один шаг больше, но так безопаснее. Я видел, как вышеуказанный метод не сработал на последних минутах работы приложения для аукционов / торгов. Поэтому я добавил еще одну строчку для безопасности!
user3833732

27

Использование общих настроек помогло мне

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
Это довольно разумный способ сделать это, если вам нужно отслеживать каждое отправленное уведомление. Наверное, это один из умных ответов.
Мухаммад Абдул-Рахим

12

Замените свою строку этой.

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

Разве при таком подходе не сложно удалить уведомление о конкретном типе полезной нагрузки?
Сетураман Сринивасан,

8

Я думаю, это поможет кому-то ..
в приведенном ниже коде "not_nu" - случайное целое число .. PendingIntent и Notification имеют одинаковый идентификатор .. так что при каждом щелчке уведомления намерение будет направлять к разным действиям ..

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

Мои уведомления все еще не складываются. Есть ли какие-то конкретные дела, которые мне нужно сделать помимо того, что вы здесь показываете?
Lion789 07

Что там делает этот расчет random.nextInt ... вы можете объяснить ??? 9999-1000 ???? что это ...
Radu

@Radu, как вы можете видеть в коде «notificationManager.notify (», принимает в качестве первого параметра int (ID для уведомления). Если этот Int (ID) такой же для нового уведомления, он заменит старый и покажет новый. если этот Int (ID) отличается, то новое уведомление обрабатывается отдельно и отображается в виде стека. поэтому старое уведомление остается. Для этого мы создаем случайный int и назначаем его как ID. random.nextInt (9999 - 1000) + 1000; "используя этот код.
Muneef M

@ Lion789 вам просто нужно использовать другой идентификатор для новых уведомлений, тогда он должен складывать уведомления.
Muneef M

новый NotificationCompat.Builder (это); устарела в Android Oreo, пожалуйста, проверьте документацию и используйте реализацию канала уведомлений.
TapanHP

5

На место uniqueIntNoпоставьте уникальное целое число вроде этого:

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


3

Я решил свою проблему вот так ...

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

Другой способ сделать это - взять текущую дату, преобразовать ее в длинную, просто возьмите последние 4 цифры. Есть большая вероятность, что номер будет уникальным.

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

Почему нужно использовать только последние четыре цифры, а не дату и время?
Мухаммад Абдул-Рахим

4
Вот немного более короткий код:int notificationId = System.currentTimeMillis()%10000;
bvk256

почему только 4 цифры?
Павел Бирюков

2

Вам просто нужно сменить однострочную строку с notificationManager.notify(0, notification);на notificationManager.notify((int) System.currentTimeMillis(), notification);...

Это изменит идентификатор уведомления всякий раз, когда появится новое уведомление.


1
notificationManager.notify(0, notification);

Поместите этот код вместо 0

new Random().nextInt() 

Как показано ниже, это работает для меня

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

1
Из обзора: Привет, пожалуйста, не отвечайте только исходным кодом. Постарайтесь дать хорошее описание того, как работает ваше решение. См .: Как мне написать хороший ответ? . Спасибо
sɐunıɔ ןɐ qɐp

0

Проблема в вашем notificationId. Думайте об этом как об индексе массива. Каждый раз, когда вы обновляете свое уведомление, notificationIdэто место, которое требуется для хранения значения. Поскольку вы не увеличиваете значение int (в данном случае ваше notificationId), оно всегда заменяет предыдущее. Думаю, лучшее решение - увеличить его сразу после обновления уведомления. И если вы хотите, чтобы он оставался постоянным, вы можете сохранить значение своего notificationIdв sharedPreferences. Когда вы вернетесь, вы можете просто взять последнее целое значение ( notificationIdсохраненное в sharedPreferences) и использовать его.


0

Ниже приведен код для передачи уникального идентификатора уведомления:

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

Выполните сброс notificationIdв savedPreferencesопределенном диапазоне, как я сделал это на 1000. Так что это не создаст никаких проблем в будущем. Дайте мне знать, если вам нужна более подробная информация или какой-либо вопрос. :)


привет, вы можете опубликовать полный код, мы знаем, что для создания нескольких уведомлений нужен уникальный идентификатор, но после генерации мы также должны отменить это конкретное уведомление .. в моем случае есть проблема с сохранением и получением каждого уникального идентификатора, если вы можете помочь,
пожалуйста,

0

Используйте в своем коде следующий метод.

Вызов метода: -

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

Метод: -

  *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

Простой счетчик может решить вашу проблему.

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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.