A notificação no android é muito utilizada, quando temos uma aplicação rodando em segundo plano por exemplo e essa aplicação necessita informar algo para o usuário a melhor maneira é exibindo uma notificação, nós não podemos simplismente abrir uma tela na frente, pois pode atrapalhar o que o usuário está fazendo no momento.
Abaixo segue um exemplo prático de como implementar uma aplicação que execute uma notificação.
Criei essa classe para controlar a criação das minhas notificações.
package br.gui; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; /** * * @author guilherme */ public class Notificacao { public static final int TIPO_ACTIVITY = 1; public static final int TIPO_BROADCAST = 2; public static final int TIPO_SERVICE = 3; public static final String INTENT_STRING_MSG_STATUS = "MSGs"; public static final String INTENT_STRING_MSG = "MSG"; public static final String INTENT_STRING_TITULO = "titu"; public static final String INTENT_LONG_QUANDO = "WHEN"; public static final String INTENT_INT_ICONE = "icone"; public static final String INTENT_INT_FLAGS = "FLS"; /** * * @param activity Atividade * @param param Parametros da notificacao * @param acao Ação quando é selecionado a notificacao * @param tipo Tipo da ação /broadcast/atividade/serviço/ * @return Notification */ public static Notification criarNotificacao(Activity activity, Intent param, Intent acao, int tipo) { //cria a notificacao Notification n = new Notification(param.getIntExtra(INTENT_INT_ICONE, 0), param.getStringExtra(INTENT_STRING_MSG_STATUS), param.getLongExtra(INTENT_LONG_QUANDO, System.currentTimeMillis())); //Responsavel pela acao caso o usuario selecione a notificacao; PendingIntent p; if (tipo == TIPO_ACTIVITY) { p = PendingIntent.getActivity(activity, 0, acao, param.getIntExtra(INTENT_INT_FLAGS, 0)); } else if (tipo == TIPO_BROADCAST) { p = PendingIntent.getBroadcast(activity, 0, acao, param.getIntExtra(INTENT_INT_FLAGS, 0)); } else if (tipo == TIPO_SERVICE) { p = PendingIntent.getService(activity, 0, acao, param.getIntExtra(INTENT_INT_FLAGS, 0)); } else { throw new IllegalArgumentException("tipo indefinido"); } //Vincula o PendingIntent com a notificacao n.setLatestEventInfo(activity, param.getStringExtra(INTENT_STRING_TITULO), param.getStringExtra(INTENT_STRING_MSG), p); //Define valores default para a notificacao ex. som,vibra. n.defaults = Notification.DEFAULT_ALL; return n; } /** * * @param activity Atividade * @param notification Notificação a ser exibida * @param id Identificador unico da notificacao * @return NotificationManager */ public static NotificationManager notificar(Activity activity, Notification notification, int id) { //pega serviço de notificacao NotificationManager nm = (NotificationManager) activity.getSystemService(Activity.NOTIFICATION_SERVICE); //exibe a notificacao nm.notify(id, notification); return nm; } }
No código acima, após a criação do notificação definimos um PedingIntent de acordo com o tipo passado no método. O PedingIntent contém as ações que devem ser tomadas caso o usuário selecione a notificação, os métodos diferente de chamada são para distintas decisões, por exemplo, o getActivty é responsável em abrir uma atividade, o getBroadcast é responsável por transmitir a intent pelo S.O (mensagem de broadcast), e o getService é responsável por chamar um serviço.
Veja o exemplo que utiliza esta classe para realizar a notificação:
package br.gui; import android.app.Activity; import android.app.Notification; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //define a intent responsavel por passar os parametros necessarios para //criar uma notificacao. Intent it = new Intent(); it.putExtra(Notificacao.INTENT_STRING_MSG, "Meu teste de notificacao."); it.putExtra(Notificacao.INTENT_STRING_MSG_STATUS, "Olá"); it.putExtra(Notificacao.INTENT_STRING_TITULO, "Titulo da notificação"); it.putExtra(Notificacao.INTENT_LONG_QUANDO, System.currentTimeMillis()); it.putExtra(Notificacao.INTENT_INT_ICONE, android.R.drawable.ic_menu_week); //Intente de ação/ou seja/ao clicar na notificação, o sistema irá abrir //uma pagina com o seguinte endereco String url = "http://www.example.com"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); //Cria a notificação. Notification notf = Notificacao.criarNotificacao(this, it, i, Notificacao.TIPO_ACTIVITY); //Manda notificar. Notificacao.notificar(this, notf, 550); } }
É uma aplicação bem simples, executa uma notificação e quando você a seleciona é aberto uma pagina em seu navegador. Nota-se que na linha que eu notifico eu passo um id, esse id é o identificador da notificação, caso eu queira cancelar a mesma eu utilizo o método .cancel(550) da classe NotificationManager.
ex:
NotificationManager nm = Notificacao.notificar(this, notf, 550); nm.cancel(550);
Pronto. Não é necessário mais nada para estar exibindo uma notificação na tela. Caso queira personalizar ainda mais sua notificação verifique a documentação no site do android:
http://developer.android.com/reference/android/app/Notification.html
Ainda é possível definir um áudio diferente, vibrar, acender a luz de fundo etc.
Estou com um problema no meu sistema de alarme, quando a notificação aparece e o app está aberto aparece um erro. Têm como a notificação só aparecer quando o app estiver fechado?
Bom teria que ver que problema esta acontecendo.
Sobre a notificação aparecer so quando o app estiver fechado tem geito sim, vc poderia fazer um tratamento, pois quando o app esta em segundo plano ou quando esta na home sua activity chama o metodo onDestroy, se esse metodo for chamado você sabe que o app nao esta mais sendo visualizado.
Tente estudar um pouco sobre o ciclo de vida da activity, se vc fazer os tratamentos necessarios você consegue saber.
Segue um link:> http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
Blz! quanto ao erro já encontrei a solução, era o som da notificação pois estava “DEFAULT_ALL” então troquei por “DEFAULT_SOUND”, não sei o porque, mas quando o aplicativo estava aberto dava erro agora não dá mas.
Muito bem explicado, e bem detalhado…óptimo post, alias todos os teus post’s são de fácil entendimento, continua assim…
O Notification está deprecated, sendo assim não consigo utilizar setLatestEventInfo, o que posso utilizar no lugar de Notification ?