Posso encontrar uma maneira de enviar parâmetros para minha atividade a partir da minha notificação.
Eu tenho um serviço que cria uma notificação. Quando o usuário clica na notificação, quero abrir minha atividade principal com alguns parâmetros especiais. Por exemplo, um ID de item, para que minha atividade possa carregar e apresentar uma exibição de detalhes de itens especiais. Mais especificamente, estou baixando um arquivo e, quando o arquivo é baixado, quero que a notificação tenha a intenção de que, quando clicada, abra minha atividade em um modo especial. Eu tentei usar putExtra
minha intenção, mas não consigo extrair, então acho que estou fazendo errado.
Código do meu serviço que cria a notificação:
// construct the Notification object.
final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());
final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image, R.drawable.icon);
contentView.setTextViewText(R.id.text, tickerText);
contentView.setProgressBar(R.id.progress,100,0, false);
notif.contentView = contentView;
Intent notificationIntent = new Intent(context, Main.class);
notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(id, notif);
Código da minha atividade que tenta buscar o parâmetro extra da notificação:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bundle extras = getIntent().getExtras();
if(extras != null){
Log.i( "dd","Extra:" + extras.getString("item_id") );
}
Os extras são sempre nulos e eu nunca coloco nada no meu log.
Btw ... onCreate
só é executado quando minha atividade é iniciada, se minha atividade já foi iniciada, também quero coletar os extras e apresentar minha atividade de acordo com o item_id que recebo.
Alguma ideia?
fonte
PendingIntent.getActivity()
com o sinalizadorPendingIntent.FLAG_UPDATE_CURRENT
, caso contrário, os mesmos extras serão reutilizados para todas as notificações.PendingIntent.getActivity()
, além de definirFLAG_ACTIVITY_SINGLE_TOP
noIntent
eFLAG_UPDATE_CURRENT
noPendingIntent
. Veja stackoverflow.com/questions/7370324/…Eu tive o problema semelhante: meu aplicativo exibe notificações de mensagens. Quando há várias notificações e, ao clicar em cada notificação, ele exibe os detalhes da notificação em uma atividade de exibição de mensagem. Eu resolvi o problema dos mesmos parâmetros extras que estão sendo recebidos na intenção da mensagem de exibição.
Aqui está o código que corrigiu isso. Código para criar a notificação Intenção.
Código para visualizar a Atividade da Mensagem.
fonte
Talvez um pouco tarde, mas: em vez disso:
Usa isto:
fonte
Encontre o mesmo problema aqui. Eu resolvo isso usando um código de solicitação diferente, use o mesmo ID da notificação, ao criar PendingIntent. mas ainda não sei por que isso deve ser feito.
fonte
Depois de ler algumas listas de e-mail e outros fóruns, descobri que o truque parece adicionar alguns dados exclusivos à intenção.
como isso:
Eu não entendo por que isso precisa ser feito, ele tem algo a ver com a intenção e não pode ser identificado apenas por seus extras ...
fonte
Eu tentei de tudo, mas nada funcionou.
eventualmente veio com a seguinte solução.
1- no manifesto adicionar para a atividade android: launchMode = "singleTop"
2- Ao fazer a intenção pendente, faça o seguinte, use bundle em vez de usar diretamente intent.putString () ou intent.putInt ()
fonte
AndroidManifest.xml
Inclua launchMode = "singleTop"
SMSReceiver.java
Defina os sinalizadores para Intent e PendingIntent
MessageDetailsActivity.java
onResume () - é chamado sempre, carrega os extras.
Espero que ajude, foi baseado em outras respostas aqui no stackoverflow, mas este é o mais atualizado que funcionou para mim.
fonte
É fácil, esta é a minha solução usando objetos!
My POJO
Notificação de método
Nova atividade
Boa sorte!!
fonte
Depois de fazer algumas pesquisas, obtive uma solução no guia do desenvolvedor do Android
Para obter um valor extra de Intenção na classe Atividade de Teste, você precisa escrever o seguinte código:
fonte
stackBuilder
?Na sua implementação de notificação, use um código como este:
Para obter valores extras de intenção no ExampleActivity, use o seguinte código:
NOTA MUITO IMPORTANTE: o método Intent :: putExtra () é um método Sobrecarregado. Para obter a chave extra, você precisa usar o método Intent :: get [Type] Extra () .
Nota: NOTIFICATION_ID e NOTIFICATION_CHANNEL_ID são constantes declaradas em ExampleActivity
fonte
Bom dia, eu também posso dizer que tentei tudo o que é mencionado nessas postagens e mais algumas de outros lugares. O problema número 1 para mim foi que o novo Intent sempre teve um pacote nulo. Meu problema foi focar demais nos detalhes de "eu incluí. Ou isso". Minha solução foi dar um passo atrás nos detalhes e examinar a estrutura geral da notificação. Quando fiz isso, consegui colocar as partes principais do código na sequência correta. Portanto, se você estiver tendo problemas semelhantes, verifique:
// Gosto de especificar o tipo de dados muito melhor. por exemplo, bundle.putInt
Com esta sequência , recebo um pacote válido.
fonte
Se você usar
no arquivo AndroidManifest.xml para o lançamento da atividade, você deve usar o seguinte em sua intenção:
Importante é definir dados exclusivos, por exemplo, usando um ID exclusivo como:
fonte
para uso de serviços
PendingIntent.FLAG_UPDATE_CURRENT
para mim trabalho.
fonte
Use como PendingIntent ao mostrar a notificação, pois ela será resolvida.
PendingIntent intent = PendingIntent.getActivity (este, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Adicione PendingIntent.FLAG_UPDATE_CURRENT como último campo.
fonte