Bildirim eski Amaç Ekstralarını geçer


134

Bu kod aracılığıyla bir BroadcastReceiver içinde bir bildirim oluşturuyorum:

String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
        int icon = R.drawable.ic_stat_notification;
        CharSequence tickerText = "New Notification";
        long when = System.currentTimeMillis();

        Notification notification = new Notification(icon, tickerText, when);
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        long[] vibrate = {0,100,200,200,200,200};
        notification.vibrate = vibrate;
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        CharSequence contentTitle = "Title";
        CharSequence contentText = "Text";
        Intent notificationIntent = new Intent(context, NotificationActivity.class);
        notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        int mynotification_id = 1;

        mNotificationManager.notify(mynotification_id, notification);

Bildirime tıkladığımda, NotificationActivity'yi açar ve Etkinlik içinde foo_id'yi Intent-Bundle'dan alabilirim (örn. 1)

Bununla birlikte, başka bir bildirim tetiklenirse ve onu tekrar tıklarsam, etkinlik hala Intent-Bundle'dan "eski" değeri (1) alır. Paketi clear () ile temizlemeye çalıştım, ancak aynı etkiyi alıyorum. Sanırım kodumla ilgili yanlış ..


lütfen bana, bekleyen
niyetten

eski ekstralar gönderdiğinin farkına varmak, triyajımı kolaylaştırdı.
Utsav Gupta

Yanıtlar:


268

Bekleyen intensleriniz için aynı istek kodunu gönderiyorsunuz. Bunu değiştir:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

Kime:

PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);

aynı parametreleri gönderirseniz, amaç oluşturulmaz. Yeniden kullanılırlar.


1
Öyleyse UNIQUE_INT_PER_CALL sağlamam gereken bir Tamsayı mı? yoksa bu bir yerde belirtilen statik bir değişken mi?
BrianM

23
android yakaladım # 147 - yani bir Intentsahip olduğunu farklı (via ekstralar putExtra) aynı ve devşirme i bekleyen bazı niyet çağrısına benzersiz bir kimlik vermedi çünkü kabul edilir - korkunç api
vel

Biliyor musun, çok dikkatsizdim. Sadece bir blokta nasıl 0 kalabileceğini düşünüyorum (benim durumumda) :(
Exigente05

3
Bu benim için inanılmaz derecede yararlıydı, sadece diğerleri için bir ipucu, muhtemelen bildiriminizi aynı yöntemle oluşturuyorsunuz ve böylece yeni bekleyen niyetin kimliğini, gideceğinizle aynı olacak şekilde ayarlayabilirsiniz. bildirimler için benzersiz kimliği kullanın!
James McNee

1
@IncrediApp, PendingIntent.getBroadcast () ile aynı mı; ?
Shruti

139

Alternatif olarak, PendingIntent'inizi oluşturmak için aşağıdaki kodu kullanabilirsiniz:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Dokümandan PendingIntent.FLAG_UPDATE_CURRENT:

Açıklanan PendingIntent zaten mevcutsa, onu saklayın, ancak fazladan verilerini bu yeni Niyetle değiştirin. Bu, yalnızca ekstraların değiştiği amaçlar oluşturuyorsanız ve önceki PendingIntent'inizi almış olan herhangi bir varlığın, açıkça kendisine verilmemiş olsa bile yeni ekstralarınızla onu başlatmasını umursamıyorsanız kullanılabilir.


Teşekkürler ... "PendingIntent.FLAG_UPDATE_CURRENT" ekleyen bu bayrak için mükemmel şekilde çalışıyoruz :)
Najib Ahmed Puthawala

1
Durumu bir alarm ayarından yayın alıcısına aktarmak için beklemede niyet kullanarak benim için çalıştı.
William T. Mallard

Keşke kullanıcılarıma bildirim göndermeden önce bu bayrakların gerçekte ne yaptığını bilseydim (!) İyi ki sıkıntılarımı çözer ...
James Andrew

42

Aynı kimliği geçiyorsunuz. Bu tür bir durumda, şunun gibi zamandan benzersiz bir kimlik yapın:

int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);

Ve şu şekilde ifade edin:

PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);

3
neden new Random () kullanmıyorsunuz? nextInt ()
2016

@hderanga "& 0xfffffff" eklemek yukarıdaki int'e ne yapar?
AJW

3
@AJW System.currentTimeMillis()bir uzun döndürürken, requestIdparametresi PendingIntent.getActivity()bir int alır. 0xffffffffbir bit maskesidir. Biraz daha fazlası olsa da, basit açıklama, "long & 0xffffffff" yapmanın en düşük 32 biti en uzun olanı verdiği ve en yüksek 32 biti attığı ve sizi esasen 32 bit int ile bıraktığıdır. Bu, basitçe bir int'e çevrim yapmaktan daha iyidir çünkü işaret bitini bozmaz (int'e int'den daha büyük bir long kullanırsanız, işaret biti taşar ve potansiyel olarak negatif bir değer elde edersiniz. )
Jordan Bondo

8

Uzun bir süre sonra en iyi yaklaşımı arayan herkes için, aşağıda gösterildiği gibi son bağımsız değişken olarak PendingIntent.FLAG_UPDATE_CURRENT'i geçmeniz gerekir.

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

yeni bir benzersiz kimlik sağlamanıza bile gerek yok.

Bunu bir dahaki sefere yapmanız gerekiyor, ilk seferde değil


1
Bu işe yaramıyor, buraya geldim çünkü yaptığım buydu.
Brill Pappin

Bunu ilk kez değil sonraki seferlerde yapmanız gerekir, işe yarayacaktır.
Nazik

0

Tüm bildirimler için istek kodunuz 0'dır. Aşağıdaki satırı değiştirin:

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

İle:

PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);

1
"System.currentTimeMillis ()" yerine "new Random (). NextInt ()" kullanmanın herhangi bir faydası var mı?
AJW

rasgele kullanmak, aynı tamsayı değerini kazara tekrar kolayca yeniden oluşturabilir, böylece eski niyetlerin geçilmesinin çok zor bulunmasına neden olur.
Sam

@AJW benim durumumda vardı. Tam olarak aynı milisaniyede 2 farklı bildirim oluşturdum, bu yüzden biri yanlış ekstralar aldı.
artman

0

Sadece başka bir seçenek eklemek istedim

 PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
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.