Android – Criando uma notificação

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.

Anúncios

5 comentários sobre “Android – Criando uma notificação

  1. 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.

  2. Pingback: Android – Unique ID « Arthur Lehdermann

  3. Pingback: Android – Criando uma notificação « Arthur Lehdermann

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s