Android – Criando uma notificação

Cópia fiel de: http://zarelli.wordpress.com/

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 simplesmente 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

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 )

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s