Android'de birden çok bildirim nasıl görüntülenir


103

Sadece bir bildirim alıyorum ve başka bir bildirim gelirse öncekinin yerini alıyor ve işte kodum

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
Resmi Belgeye göre, bir uygulamadan birden fazla bildirim göstermemelisiniz, tüm bildirimleri yığmanız gerekir .. Bir göz atın: developer.android.com/design/patterns/notifications_k.html
Gowtham Kumar

Yanıtlar:


134

sadece satırını bununla değiştir

 notificationManager.notify(Unique_Integer_Number, notification);

umarım sana yardımcı olur.


2
Unique_Integer_Numberkodunuzda ne var .. ve hangi kodun yerini alması gerektiği
Kartheek

4
Benzersiz tam sayı, asla tekrarlanmayacak bir tamsayı değeri ayarlamanız gerektiği anlamına gelir. örnek 0,1,2,3,4,5, .... !!!!
Sanket Şah

2
notificationManager.notify (1, bildirim); notificationManager.notify (2, bildirim);
Sanket Şah

1
Bildirim geldikçe otomatik olarak nasıl artacak?
Mitesh Shah

21
benzersiz tamsayı oluşturma: (int) ((yeni Tarih (). getTime () / 1000L)% Tamsayı.MAX_VALUE);
Andrii Kovalchuk

87

Basit bildirim kimliğinin değiştirilebilir olması gerekir.

Bildirim_kimliği için rastgele sayı oluşturmanız yeterlidir.

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

veya tieorange tarafından söylendiği gibi rasgele sayı oluşturmak için bu yöntemi kullanabilirsiniz (bu asla tekrarlanmaz):

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

ve rasgele sayı üretecek şekilde bildirim kimliği için parametre eklemek üzere bu satırı değiştirin

    notificationManager.notify(m, notification);

8
Biraz hilekar ve aynı bildirim kimliğiyle sonuçlanma olasılığıyla karşılaşır, ancak gerçekten hızlı bir şeye ihtiyacınız varsa bu işe yarar.
Muhammad Abdul-Rahim

1
Bunu doğru görürsem, tieorange'den gelen yaklaşım sadece saniyelerle çalışır. Yani aynı anda birden fazla bildiriminiz varsa bu çalışmayacaktır.
test

1
@testing doğru. bu yüzden 2. adımım var, m + = random.nextInt (100) + 1; bu bir adım fazladan olabilir, ancak daha güvenli bir yol. Bir Açık Artırma / Teklif verme uygulamasının son dakikalarında yukarıdaki yöntemin başarısız olduğunu gördüm. Bu yüzden güvenlik için başka bir satır ekledim!
user3833732

27

Paylaşılan Tercihleri ​​kullanmak benim için çalıştı

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
Gönderilen her bildirimi de takip etmeniz gerekiyorsa, bu oldukça akıllıca bir yoldur. Muhtemelen buradaki daha akıllı cevaplardan biri.
Muhammad Abdul-Rahim

12

Çizginizi bununla değiştirin.

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

Bu yaklaşımla belirli bir yük türünün bildirimini kaldırmak zor olmuyor mu?
Sethuraman Srinivasan

8

sanırım bu birisine yardımcı olacaktır ..
aşağıdaki koddaki "not_nu" rastgele bir inttir .. PendingIntent ve Notification aynı ID'ye sahiptir .. böylece her bildirimde tıklama amacı farklı aktiviteye yönlendirecektir ..

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

Bildirimlerim hâlâ üst üste yığılmıyor, burada gösterdiklerinizden başka yapmam gereken belirli şeyler var mı?
Lion789

Bu random.nextInt hesaplamasının orada yaptığı nedir ... açıklayabilir misin ??? 9999-1000 ???? bu nedir ...
Radu

@Radu, "notificationManager.notify (" ilk parametre olarak bir int (bildirim için ID) alır. Eğer bu Int (ID) yeni bildirim için aynıysa, eskisinin yerini alacak ve yenisini gösterecektir. bu Int (ID) farklıysa, yeni bildirim ayrı olarak ele alınır ve yığınlar olarak gösterilir. Bu nedenle eski bildirim kalır. Bunu başarmak için rastgele int oluşturuyoruz ve kimlik olarak atıyoruz. "random.nextInt (9999 - 1000) + 1000; "bu kodu kullanarak.
Muneef M

@ Lion789 yeni bildirimler için farklı bir kimlik kullanmanız yeterlidir, ardından bildirimleri biriktirmelidir.
Muneef M

new NotificationCompat.Builder (bu); Android Oreo'da kullanımdan kaldırıldı, Lütfen belgeleri kontrol edin ve Bildirim Kanalı uygulamasını kullanın.
TapanHP

5

uniqueIntNoEşsiz tam sayı koyma yerine şöyle:

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


3

Sorunumu böyle çözdüm ...

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

Bunu yapmanın başka bir yolu, geçerli tarihi alıp, onu uzaya çevirmek, sadece son 4 rakamı almaktır. Sayının benzersiz olma olasılığı yüksek.

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

Neden tarih saatini değil de son dört rakamı kullanasınız?
Muhammad Abdul-Rahim

4
İşte biraz daha kısa bir kod:int notificationId = System.currentTimeMillis()%10000;
bvk256

neden sadece 4 hane?
Pavel Biryukov

2

Sadece tek satırınızı olarak notificationManager.notify(0, notification);değiştirmelisiniz notificationManager.notify((int) System.currentTimeMillis(), notification);...

Bu, yeni bildirim göründüğünde bildirimin kimliğini değiştirecektir.


1
notificationManager.notify(0, notification);

Bu kodu 0 yerine koyun

new Random().nextInt() 

Aşağıdaki gibi benim için çalışıyor

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

1
Yorumdan: Merhaba, lütfen sadece kaynak kodu ile cevap vermeyin. Çözümünüzün nasıl çalıştığı hakkında güzel bir açıklama sağlamaya çalışın. Bakınız: Nasıl iyi bir cevap yazabilirim? . Teşekkürler
sɐunıɔ ןɐ qɐp

0

Sorun senin notificationId. Bir dizi indeksi olarak düşünün. Bildiriminizi her güncellediğinizde, notificationIddeğeri depolamak için gereken yer burasıdır. İnt değerinizi artırmadığınız için (bu durumda sizin notificationId), bu her zaman öncekinin yerini alır. Sanırım en iyi çözüm, bir bildirimi güncelledikten hemen sonra bunu artırmaktır. Kalıcı tutmak istiyorlarsa, o zaman değerini saklayabilir notificationIdin sharedPreferences. Ne zaman geri dönersen, son tam sayı değerini alabilirsin (notificationId saklanan sharedPreferences) alıp kullanabilirsin.


0

Geçiş benzersiz bildirim kimliği kodu aşağıdadır:

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

1000'de yaptığım gibi belirli aralıkta sıfırlayın notificationId. savedPreferencesBu nedenle gelecekte herhangi bir sorun yaratmayacaktır. Daha ayrıntılı bilgiye veya herhangi bir sorguya ihtiyacınız olursa bana bildirin. :)


merhaba tam kodu iyi bir şekilde gönderebilir misiniz, birden fazla bildirim oluşturmak için benzersiz bir kimliğe ihtiyaç duyduğumuzu biliyoruz, ancak oluşturduktan sonra bu bildirimi iptal etmemiz gerekiyor .. yardım edebilirseniz benim durumumdaki her benzersiz kimliği kaydetme ve alma konusunda sorun var pls
Jayman Jani

0

Kodunuzda aşağıdaki yöntemi kullanın.

Yöntem çağrısı: -

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

Yöntem:-

  *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

Basit bir sayaç sorununuzu çözebilir.

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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.