Anda di halaman 1dari 17

FRONT-END PROGRAMAO MOBILE BUSINESS DESIGN E UX INFRA NOSSOS CURSOS

FIQUE POR DENTRO

Receba os principais contedos de


programao, design e tecnologia no
seu email! Inscreva-se, como outros
milhares de prossionais.

Digite seu e-mail


Assinar

powered by MailMunch

Tratando notificaes recebidas


do Firebase no Android
31 de janeiro de 2017 / Android Java Mobile Programao / PESQUISAR POSTS

0 Comments
Buscar
(ltima atualizao em: 31 de janeiro de 2017)

No post onde vimos como configurar o FCM (Firebase Cloud Messaging)


PDFmyURL lets you convert a complete website to PDF automatically!
e integrar com a nossa App Android. Fizemos um pequeno exemplo de
envio de notificao, porm, no exemplo que vimos, a notificao no U

aparecia em foreground, ou seja, enquanto estvamos com a App


aberta. Em outras palavras, queremos obter um resultado conforme o
CONHEA NOSSAS CARREIRAS
exemplo abaixo:

Iniciante em Programao

Desenvolvedor Android Jnior

Como podemos fazer isso? Atualmente, a classe que fica responsvel em


receber
PDFmyURL lets youas mensagens
convert do
a complete FCM est
website to PDFcom o seguinte
automatically! cdigo: Desenvolvedor Front-end
receber as mensagens do FCM est com o seguinte cdigo: Desenvolvedor Front-end

public class CDCMessasingService extends FirebaseMessagingService {


}

O que ser que podemos fazer para que, de alguma forma, consigamos Design Web Junior
receber a mensagem do FCM dentro dessa classe? Ser que existe
algum mtodo que podemos sobrescrever? Para a nossa felicidade,
existe sim!

Pegando a mensagem do FCM


De acordo com a documentao do FCM para envio de mensagens, Agilista
para que consigmos receber e tratar mensagens dentro da nossa App,
precisamos sobrescrever o mtodo onMessageReceive() dentro da
classe FirebaseMessagingService . Portanto, faremos isso:

public class CDCMessasingService extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}

A partir desse mtodo, quando a nossa App estiver aberta, receberemos


Desenvolvedor ASP.NET Jnior
a notificao do FCM e ela ser representada pelo parmetro
remoteMessage . Mas e depois? Aparecer a notificao

automaticamente como vimos anteriormente? Nesse caso no, pois


recebemos apenas a mensagem. Em outras palavras, precisamos criar a
notificao manualmente.
PDFmyURL lets you convert a complete website to PDF automatically!
notificao manualmente.

Criando a notificao no Android Certificao Oracle 12c: Exame


1Z0-061
J que estamos recebendo uma notificao, podemos extra-la para um
objeto do tipo RemoteMessage.Notification :

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
RemoteMessage.Notification notification = remoteMessage.getNotification();
}

Social Media Marketing


Em seguida, vamos criar um mtodo que vai criar e exibir uma
notificao do Android. Portanto, vamos criar o mtodo
mostrarNotificacao() que recebe um objeto do tipo

RemoteMessage.Notification :

public class CDCMessasingService extends FirebaseMessagingService {

@Override Certificao Java OCJP I


public void onMessageReceived(RemoteMessage remoteMessage) {
RemoteMessage.Notification notification =
remoteMessage.getNotification();
mostrarNotificacao(notification);
}

public void mostrarNotificacao(RemoteMessage.Notification notification) {


}

Desenvolvedor JavaScript
Agora que criamos o mtodo, o que precisamos fazer? Criar de fato a
Quer mais? Ento d uma olhada em todas
notificao que ser exibida para o usurio, certo? No Android, temos a carreiras que temos para voc!
classe Notification que permite criarmos notificaes. Porm, da
PDFmyURL lets you convert a complete website to PDF automatically!
mesma forma como vimos no AlertDialog , recomendado que utilize
a classe interna Builder para criarmos as notificaes. Portanto vamos TPICOS RECENTES

utiliz-la:
Quais impactos de performance ao usar
public void mostrarNotificacao(RemoteMessage.Notification notification) { servios externos de fontes?
Notification.Builder builder = new Notification.Builder(this);
}
Saiba como se manter em constante

Por questes de compatibilidade, recomendado que utilizemos a atualizao profissional

classe NotificationCompat . Em outras palavras, por meio dela, Entenda o que a UX design

daremos suporte para verses do Android mais antigas. Portanto, Quem est por trs das principais
vamos utiliz-la ao invs da Notification : linguagens de programao?

public void mostrarNotificacao(RemoteMessage.Notification notification) { Como inserir textos sobre imagens e


NotificationCompat.Builder builder = new NotificationCompat.Builder(this obter um melhor design?
}

Voc pode estar se perguntando do motivo de estarmos passando o


PGINAS
this por parmetro do NotificationCompat.Builder() , j que no

estamos em uma Activity ou Context . Um detalhe curioso sobre a Boas prticas de JavaScript com os
experts da Alura
classe FirebaseMessagingService que ela, bem internamente,
Boas prticas de refatorao Java
contm uma herana de Context , portanto, podemos utiliz-la!
Boas prticas de SQL com os experts da
Agora que instanciamos o builder , precisamos montar a notificao. Alura

Para isso temos que, pelo menos, preencher 3 informaes:

Ttulo.

PDFmyURL letsMensagem.
you convert a complete website to PDF automatically!
Mensagem.
cone.

Para adicionar um ttulo, basta apenas utilizarmos o mtodo


setContentTitle() enviando uma String como parmetro. Mas

calma a, qual String mandaremos? Lembra que temos o parmetro


notification ? Ento, nesse parmetro temos todos os dados que

uma notificao do FCM pode ter, portanto, vamos extrair o ttulo por
meio do mtodo getTitle() :

public void mostrarNotificacao(RemoteMessage.Notification notification) {


String titulo = notification.getTitle();
NotificationCompat.Builder builder = new NotificationCompat.Builder(this
builder.setContentTitle(titulo);
}

E pra adicionar uma mensagem? Simples, da mesma forma como vimos


no builder do AlertDialog , a maioria dos mtodos do builder
tambm nos devolve o objeto. Em outras palavras, basta apenas
chamarmos o mtodo que adiciona a mensagem aps o momento em
que inserimos o ttulo, nesse caso, o mtodo setContentText() :

String titulo = notification.getTitle();


NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(titulo)
.setContentText("");

Mas qual mensagem enviamos para ele? Da mesma forma como fizemos
com o ttulo, podemos tambm pegar a mensagem do objeto
PDFmyURL lets you convert a complete website to PDF automatically!
notification a partir do mtodo getBody() :

public void mostrarNotificacao(RemoteMessage.Notification notification) {


String titulo = notification.getTitle();
String mensagem = notification.getBody();

builder.setContentTitle(titulo)
.setContentText(mensagem);
}

Agora que temos um ttulo e uma mensagem, precisamos apenas


adicionar um cone. Podemos fazer isso por meio do mtodo
setSmallIcon() . Mas qual cone podemos utilizar? Nesse projeto,

temos o cone da prpria App no local R.drawable.casadocodigo , ou


seja, vamos utiliz-lo:

.setSmallIcon(R.drawable.casadocodigo)
}

Da mesma forma como vimos no AlertDialog , finalizamos a builder


com o mtodo build() :

builder.setContentTitle(titulo)
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();

Utilizando o servio de notificaes do


Android
Se executarmos a nossa App nesse exato momento, a notificao no
aparece! Por que ser? Diferente do Dialog , as notificaes fazem
parte
PDFmyURL de convert
lets you um servio gerenciado
a complete website topelo sistema operacional,
PDF automatically! nesse caso o
parte de um servio gerenciado pelo sistema operacional, nesse caso o
Android, ou seja, precisamos pedir para o Android esse servio. Para
isso, utilizamos o mtodo getSystemService() :

builder.setContentTitle(titulo)
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();
getSystemService();

Porm, precisamos especificar qual servio queremos enviando uma


String por parmetro. Qual String podemos enviar? A classe

Context contm algumas constantes referentes a esses servios e,

para a nossa felicidade, ela contm a constante


NOTIFICATION_SERVICE que refere-se justamente ao servio de

notificao que desejamos. Portanto vamos pedir esse servio:

builder.setContentTitle(titulo)
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();
getSystemService(Context.NOTIFICATION_SERVICE);

Agora precisamos referenciar esse servio. Por padro, ele nos devolve
um Object , porm, precisamos de algum mais especfico! Qual classe
podemos referenciar? No Android, temos a classe NotificationManager
que um classe responsvel em gerenciar notificaes do Android.
Ento vamos refenciar essa classe adicionando um cast, pois temos a
certeza que essa classe que ser retornada:

builder.setContentTitle(titulo)
.setContentText(mensagem);
PDFmyURL lets you convert a complete website to PDF automatically!
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Exibindo a notificao
A partir do objeto notificationManager , para exibirmos a notificao,
basta apenas chamarmos o mtodo notify() enviando dois
parmetros:

1 parmetro: id da notificao (Esse id um valor nico para a


notificao que est sendo criada dentro da App).
2 parmetro: um objeto do tipo Notification.

Como primeiro parmetro, podemos enviar qualquer valor, portanto,


colocarei como 0. Porm, e o objeto do tipo Notification ? Como
podemos envi-lo sendo que temos apenas o builder do tipo
NotificationCompat.Builder ?

Lembra do mtodo build() ? Adivinha o que ele retorna?


exatamente o que voc est pensando! Um objeto do tipo
Notification , em outras palavras, basta apenas refenci-lo para um

objeto do tipo Notification :

Notification notificacao = builder.setContentTitle(titulo)


.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();
PDFmyURL lets you convert a complete website to PDF automatically!
.build();

Ento enviamos o objeto notificacao para o notify() :

public void mostrarNotificacao(String mensagem) {


String titulo = notification.getTitle();
String mensagem = notification.getBody();

NotificationCompat.Builder builder =
new NotificationCompat.Builder(getApplicationContext());
Notification notificacao = builder.setContentTitle(titulo)
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.build();

NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificacao);
}

Testando a nossa App e enviando uma mensagem a partir do firebase,


temos o seguinte resultado:

PDFmyURL lets you convert a complete website to PDF automatically!


Adicionando uma ao na notificao
U, por que ser que a notificao no faz nada? Um detalhe
importante sobre notificaes, que por padro, elas no possuem
aes de clique, portanto, precisamos dar uma ao pra ela!

Geralmente as aes de uma notificao justamente levar o usurio


para uma activity, na maioria dos casos a Launcher da App, nesse caso a
MainActivity . Portanto, o nosso primeiro passo justamente criar

uma Intent para essa activity:

public void mostrarNotificacao(RemoteMessage.Notification notification) {


String titulo = notification.getTitle();
String mensagem = notification.getBody();

Intent intent = new Intent(this, MainActivity.class);

//restante do cdigo

Porm, a classe Notification no possui nenhum mtodo que receba


uma Intent Ento como podemos fazer com que a nossa notificao
PDFmyURL lets you convert a complete website to PDF automatically!
abra essa activity? No Android, temos a classe PadingIntent que alm
de nos permitir instanciar activities ou services do Android, permite dar
uma ao para a notificao. Portanto, vamos implement-la:

public void mostrarNotificacao(RemoteMessage.Notification notification) {


String titulo = notification.getTitle();
String mensagem = notification.getBody();

Intent intent = new Intent(this, MainActivity.class);

PendingIntent pendingIntent = PendingIntent


.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Observe que no instnciamos a PedingIntent na mo, justamente


porque ela mesmo j nos fornece instncias com os seus valores
necessrios j inicializados. Nesse caso, chamamos o mtodo
getActivity() que nos devolve um objeto do tipo PedingIntent que

inicializa uma activity. Observe tambm que j enviamos alguns valores


como parmetro que tem o seguinte significado:

1 parmetro: Contexto onde ser inicializado.


2 parmetro: refere-se ao request code que um id para identificar
o peding intent dentro da App. (Nesse caso, podemos
simplesmente passar qualquer valor).
3 parmetro: Intent que ser executada.

4 parmetro: Flags que indicam o comportamento do pending


PDFmyURL lets you convert a complete website to PDF automatically!
intent, nesse exemplo utilizei a constante

PendingIntent.FLAG_UPDATE_CURRENT que indica que a peding


intent j existe e quero apenas atualizar os dados recebidos pelos
extras. (Para mais detalhes das flags consulte a documentao)

Agora que temos o objeto pedingIntent , precisamos apenas sett-lo


no objeto notification a partir do mtodo setContentIntent() :

NotificationCompat.Builder builder =
new NotificationCompat.Builder(getApplicationContext());
Notification notificacao = builder.setContentTitle(titulo)
.setContentText(mensagem);
.setSmallIcon(R.drawable.casadocodigo)
.setContentIntent(pendingIntent)
.build();

Se executarmos novamente a nossa App, temos o seguinte resultado:

PDFmyURL lets you convert a complete website to PDF automatically!


Agora a notificao tem uma ao! Nesse caso, ela abre a
MainActivity , entretanto, observe que a notificao, mesmo sendo

tocada, ainda permanece na barrinha superior do Android! Por que


ser? Por padro, quando criamos uma notificao ela s sai da barrinha
do Android caso o usurio feche manualmente

Mas o ideal seria fechar assim que tocar, certo? Ser que podemos fazer
isso? Sim, podemos! E mais fcil do que parece, ou seja, basta apenas
pedir para o builder que a notificao auto cancelada assim que
tocamos chamando o mtodo setAutoCancel() que recebe um
booleano como parmetro, ou seja, passamos o valor true :

public void mostrarNotificacao(RemoteMessage.Notification notification) {


String titulo = notification.getTitle();
String mensagem = notification.getBody();

Intent intent = new Intent(this, MainActivity.class);


PendingIntent pendingIntent = PendingIntent
.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this

Notification notificacao = builder


.setSmallIcon(R.drawable.casadocodigo)
PDFmyURL lets you convert a complete website to PDF automatically!
.setSmallIcon(R.drawable.casadocodigo)
.setContentTitle(titulo)
.setContentText(mensagem)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();

NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificacao);
}

Pronto! Agora temos o mesmo resultado como vimos no incio do post.


Em outras palavras, estamos recebendo e tratando uma mensagem do
FCM em foreground.

E a, o que achou de criar uma notificao no Android? Mais fcil do que


parecia? No? Ento compartilhe conosco sobre sua experincia
durante a implementao

Que tal aprender hoje mesmo a desenvolver a sua App Android desde o
zero? Na Alura, temos a carreira desenvolvedor Android Jnior com 4
cursos de Android para que voc crie sua primeira App com os principais
conceitos necessrios para desenvolver uma App.

Fique por dentro


Receba os principais contedos de programao, design e tecnologia no
seu email! Inscreva-se, como outros milhares de prossionais.

Digite seu e-mail


PDFmyURL lets you convert a complete website to PDF automatically!
Digite seu e-mail

Quero receber contedos

powered by MailMunch

Compartilhe:

33

Compartilhe este Post

1 >

Alex Felipe
Content Editor at Alura and Software Developer

PDFmyURL lets you convert a complete website to PDF automatically!


Prximo Artigo
2 PASSOS PARA O E-MAIL MARKETING NO SER
MARCADO COMO SPAM

Copyright 2017 Alura www.alura.com.br

PDFmyURL lets you convert a complete website to PDF automatically!