Як відобразити кілька повідомлень в 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 s

4
Унікальне ціле число означає, що ви повинні встановити ціле значення, яке ніколи не повториться. приклад 0,1,2,3,4,5, .... !!!!
Sanket Shah

2
notiManager.notify (1, повідомлення); notiManager.notify (2, повідомлення);
Sanket Shah

1
Як збільшуватиметься автоматично, коли надходить повідомлення ??
Мітеш Шах

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

87

Просте повідомлення_id має бути зміненим.

Просто створіть випадкове число для noti_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
Якщо я бачу це правильно, апарат з краватки працює лише секунди. Тож якщо у вас є кілька сповіщень за одну секунду, це не працюватиме.
тестування

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

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

Що це за випадковий розрахунок, який робиться там ... чи можете ви пояснити ??? 9999-1000 ???? що це ...
Раду

@Radu, як ви бачите в коді "notiManager.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. Таким чином , він не буде створювати ніяких проблем в майбутньому. Повідомте мене, якщо вам потрібна більш детальна інформація чи запит. :)


привіт, ви можете опублікувати повний код, добре, що ми знаємо, що для отримання декількох повідомлень потрібен унікальний ідентифікатор, але після генерації нам також потрібно скасувати це конкретне повідомлення. Є проблема в збереженні та отримання кожного унікального ідентифікатора в моєму випадку, якщо ви можете допомогти pls
Jayman Jani

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.