Estou criando uma notificação dentro de um BroadcastReceiver através deste código:
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);
Quando clico na notificação, ela abre o NotificationActivity e, dentro da Activity, posso recuperar o foo_id do Intent-Bundle (por exemplo, 1)
No entanto, se outra notificação for acionada e eu clicar nela novamente, a atividade ainda receberá o valor "antigo" (1) do Intent-Bundle. Tentei limpar o pacote com clear (), mas estou recebendo o mesmo efeito. Eu acho que sth está errado com o meu código ..
Respostas:
Você está enviando o mesmo código de solicitação para o intens pendente. Mude isso:
Para:
intenções não são criadas se você enviar os mesmos parâmetros. Eles são reutilizados.
fonte
Intent
que tem diferentes extras (viaputExtra
) são considerados o mesmo e re-utilizado, porque eu não forneceu um ID único para alguns chamam intenção pendente - api terrívelComo alternativa, você pode usar o seguinte código para gerar seu PendingIntent:
Do documento para
PendingIntent.FLAG_UPDATE_CURRENT
:fonte
Você está passando o mesmo ID. Nesse tipo de situação, crie um ID exclusivo a partir de um momento como este:
E coloque assim:
fonte
System.currentTimeMillis()
retorna um longo, enquanto orequestId
parâmetro dePendingIntent.getActivity()
leva um int.0xffffffff
é uma máscara de bit. Embora exista um pouco mais, a explicação simples é que fazer 'long & 0xffffffff' fornece os 32 bits mais baixos dos longos e descarta os 32 bits mais altos, deixando-o essencialmente com um int de 32 bits. Isso é melhor do que simplesmente converter para um int, porque ele não estraga o bit de sinal (se você converter um comprimento maior que um int para um int, o bit de sinal transbordará e você poderá acabar com um valor negativo )Para quem procura a melhor abordagem após um longo período de tempo, é necessário passar o PendingIntent.FLAG_UPDATE_CURRENT como o último argumento, como mostrado abaixo
você nem precisa fornecer um novo ID exclusivo.
Você precisa fazer isso da próxima vez em diante, não pela primeira vez
fonte
Seu código de solicitação é 0 para toda a notificação. Altere a seguinte linha:
Com:
fonte
Só queria adicionar outra opção
fonte