protected void displayNotification(String response) {
Intent intent = new Intent(context, testActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification = new Notification(R.drawable.icon, "Upload Started", System.currentTimeMillis());
notification.setLatestEventInfo(context, "Upload", response, pendingIntent);
nManager.notify((int)System.currentTimeMillis(), notification);
}
Esta função será chamada várias vezes. Gostaria que cada um notification
iniciasse testActivity quando clicado. Infelizmente, apenas a primeira notificação inicia testActivity. Clicar no resto faz com que a janela de notificação seja minimizada.
Informações extras: a função displayNotification()
está em uma classe chamada UploadManager
. Context
é passado para a UploadManager
partir das activity
instancias. A função displayNotification()
é chamada várias vezes a partir de uma função, também em UploadManager, que está sendo executada em um AsyncTask
.
Edição 1: esqueci de mencionar que estou passando a resposta de String Intent intent
como um extra
.
protected void displayNotification(String response) {
Intent intent = new Intent(context, testActivity.class);
intent.putExtra("response", response);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Isso faz uma grande diferença porque eu preciso da "resposta" extra para refletir qual era a resposta da String quando a notificação foi criada. Em vez disso, usando PendingIntent.FLAG_UPDATE_CURRENT
, a "resposta" extra reflete a resposta da String na última chamada displayNotification()
.
Eu sei por que isso acontece lendo a documentação no FLAG_UPDATE_CURRENT
. No entanto, não tenho certeza de como contornar isso no momento.
fonte
Estava lutando com
RemoteViews
e vários diferentesIntents
para cada umButton
noHomeScreen
Widget. Funcionou quando adicionado estes:1
intent.setAction(Long.toString(System.currentTimeMillis()));
2
PendingIntent.FLAG_UPDATE_CURRENT
fonte
setAction
setAction
, o que você pode fazer éaddCategory
.PendingIntent
usaIntent.filterEquals
para verificar a igualdade da ação, dados, tipo, classe e categorias. developer.android.com/reference/android/content/…Definir ação resolveu isso para mim. Este é meu entendimento da situação:
Eu tenho vários widgets que têm um PendingIntent anexado a cada um. Sempre que um era atualizado, todos eram atualizados. Os sinalizadores existem para descrever o que acontece com os PendingIntents que são exatamente iguais.
A descrição de FLAG_UPDATE_CURRENT é muito melhor agora:
Se o mesmo PendingIntent que você está criando já existe, atualize todos os antigos para o novo PendingIntent que está criando.
A definição de exatamente o mesmo considera todo o PendingIntent, EXCETO os extras. Portanto, mesmo que você tenha extras diferentes em cada intent (para mim, eu estava adicionando o appWidgetId) ao android, eles são iguais.
Adicionar .setAction com alguma string única fictícia informa o sistema operacional. Eles são completamente diferentes e não atualizam nada. No final, aqui está minha implementação que funciona como eu queria, onde cada widget tem seu próprio Intent de configuração anexado:
ATUALIZAR
Solução ainda melhor caso você esteja trabalhando com transmissões. Unique PendingIntents também são definidos por códigos de solicitação exclusivos. Esta é minha solução:
fonte
Eu vejo respostas, mas nenhuma explicação. Além disso, nenhuma das respostas aborda todas as soluções possíveis, então tentarei deixar isso claro.
Documentação:
Causa do problema:
Você cria 2 notificações com 2 intents pendentes. Cada intent pendente está associado a um intent:
No entanto, essas 2 intents são iguais, portanto, quando sua segunda notificação chegar, ela iniciará a primeira intent.
Solução:
Você deve tornar cada intent única, para que nenhuma intent pendente seja igual. Como você torna as intenções únicas? Não pelos extras que você usa
putExtra()
. Mesmo que os extras sejam diferentes, as intenções ainda podem ser iguais. Para tornar cada intent única, você deve definir um valor único para a ação da intent, ou dados, ou tipo, ou classe, ou categoria, ou código de solicitação: (qualquer um deles funcionará)intent.setAction(...)
intent.setData(...)
intent.setType(...)
intent.setClass(...)
intent.addCategory(...)
PendingIntent.getActivity(context, YOUR_UNIQUE_CODE, intent, Intent.FLAG_ONE_SHOT);
Observação : definir um código de solicitação exclusivo pode ser complicado porque você precisa de um int, enquanto
System.currentTimeMillis()
retorna longo, o que significa que alguns dígitos serão removidos. Portanto, eu recomendaria ir com a categoria ou ação e definir uma string única.fonte
Tive o mesmo problema e consegui corrigi-lo alterando o sinalizador para:
fonte
Conforme a documentação, use um código de solicitação exclusivo:
fonte
Fwiw, tive mais sorte com do
PendingIntent.FLAG_CANCEL_CURRENT
que comPendingIntent.FLAG_UPDATE_CURRENT
.fonte
Eu tive o mesmo problema e corrigi-lo pelas etapas abaixo
1) Limpe qualquer sinalizador de intenção
2) insira intent.setAction pelo código abaixo
3) para Pendingintent, insira o código abaixo
Espero trabalhar com você
fonte
Em PendingIntent há dois parâmetros int, o segundo e o último. O segundo é o "código de solicitação" e deve ser um número único (por exemplo, id de sua notificação), senão se (como em seu exemplo for igual a zero, sempre será sobrescrito).
fonte
fonte
para enviar dados extras corretamente, você deve enviar com intenção pendente o id de notificação como este: PendingIntent pendingIntent = PendingIntent.getActivity (context, (int) System.currentTimeMillis () , intent, PendingIntent.FLAG_UPDATE_CURRENT);
fonte
Eu tenho o mesmo problema e uso o PendingIntent.html.FLAG_UPDATE_CURRENT para corrigi-lo.
Eu verifiquei o código-fonte. Em ActivityManagerService.java , o método principal é o seguinte. Quando o sinalizador é PendingIntent.FLAG_UPDATE_CURRENT e updateCurrent é verdadeiro. Alguns extras serão substituídos por novos e obteremos um PendingIntent substituído.
fonte
Tive o mesmo problema e consegui corrigi-lo alterando o sinalizador para:
fonte