Como Exibir uma Notificação no Android–Parte II

As notificações no android são exibidas normalmente com um título e uma linha de texto, mas existem situações em que é necessário atualizar a notificação, como no caso das notificações que informam a chegada de e-mail. Por exemplo, quando chega mais de um e-mail a notificação pode exibir quantas mensagens chegaram até o momento e o assunto de cada mensagem.
Dando continuidade ao post Como Exibir Notificações no Android - Parte I, este post mostra como exibir notificações, utilizando um estilo grande, onde são exibidas mais de uma linha de informação, e como cancelar programaticamente as notificações sendo exibidas para o usuário.
As notificações em estilo grande somente serão exibidas em dispositivos android versão 4.1 (API 16) ou superior. Para demonstrar como exibir a notificação em estilo grande foi criado um projeto de uma Activity com os botões Criar Notificação, Atualizar Notificação e Fechar Notificação.
notificacaoexemplo1

Criar a Notificação
O botão Criar Notificação chama o método criaNotificacao() que inicializa a variável mBuilder do tipo Notification.Builder, com as informações de ícone, título e texto, e exibe uma notificação simples através do método notifica(). Este método além de exibir a notificação utilizando o método notify(int, Notification) da classe NotificationManager, também configura o valor da identificação da notificação.
    private void criaNotificacao(){
        
        // Cria a notificação com as informações de
        // ícone, título e texto
        mBuilder =  new Notification.Builder(this)
                .setSmallIcon(R.drawable.ic_notification_romar)
                .setContentTitle("Notificação Estilo Grande")
                .setContentText("Estilo diferente...");

        // Inicializa o número de mensagens
        numMensagens = 0;

        // Exibe a notificação
        notifica();
    }


    private void notifica()
    {
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService
                (Context.NOTIFICATION_SERVICE);
            
        // A constante NOTIFICACAO_TESTE é uma identificação
        // que pode ser utilizada para atualizar a notificação posteriormente
        mNotificationManager.notify(NOTIFICACAO_TESTE, mBuilder.build());
        
    }
Quando o botão Criar Notificação é clicado a seguinte notificação é exibida no dispositivo:
device-2014-10-01-224914
Até este momento está sendo exibida uma notificação em estilo normal, porque  foi configurado somente a notificação padrão. Para exibir uma notificação em estilo grande optei em inserir várias linhas de mensagens na mesma notificação, simulando a chegada de uma nova mensagem.
Atualizar a Notificação
Para executar esta função foi criado o botão Atualizar Notificação, que tem por tarefa inserir uma linha de mensagem cada vez que o botão for pressionado, este botão chama o método atualizaNotificacao(). Este método configura o título, insere as mensagens em uma lista e configura o número de mensagens que foram inseridas.
    private void atualizaNotificacao()
    {
        Notification.InboxStyle inboxStyle =
                new Notification.InboxStyle();

        // Define o título para a mensagem de estilo grande
        inboxStyle.setBigContentTitle("Exibe várias Mensagens");
        
        // Incrementa o número de mensagens
        numMensagens++;
        
        // Insere a mensagem na lista de mensagens
        listaMensagens.add("Mensagem de notificação " +  String.valueOf(numMensagens));
        
        // Escreve a mensagem 
        for (String mensagem : listaMensagens) {
            inboxStyle.addLine(mensagem);
        }
        
        // Configura o estilo na notificação.
        mBuilder.setStyle(inboxStyle);
        
        // Atualiza o número de notificações sendo exibida
        mBuilder.setNumber(numMensagens);

        // Exibe a notificação
        notifica();
    }

Cada vez que o botão Atualizar Notificação for clicado uma mensagem é inserida na notificação existente, porque estamos atualizando sempre a notificação com a mesma identificação. Se por exemplo clicarmos 5 vezes no botão a notificação fica com a seguinte aparência:
not_varias_msg_1
Observe que a notificação é apresentada com o título, o texto padrão e o número 5 no canto direito, indicando que existem mais mensagens a serem visualizadas. Note que a notificação criada pelo programa está sendo exibida no meio de outras duas notificações. Quando isto ocorre é necessário expandir a notificação, utilizando o movimento de pinça com os dedos, para visualizar todas as mensagens, como exibida na figura abaixo:
not_varias_msg_2
Uma observação importante é que, a notificação só vai ser apresentada em estilo grande expandido se for a primeira notificação da lista de notificações. 
Cancelar a Notificação
A notificação pode ser cancelada programaticamente de várias formas. Podemos configurar a notificação para que seja cancelada no momento em que é clicada durante a visualização, utilizando o método setAutoCancel(boolean) da classe Notification.Builder, que pode ser configurado no momento da criação da notificação. No caso do projeto deste post bastaria utilizar o objeto mBuilder para configurar o método da seguinte forma:
mBuilder.setAutoCancel(true);  
Uma outra forma de cancelar a notificação é utilizar o método cancel(int) da classe NotificationManager. Para demonstrar como utilizar este método foi criado o botão Fechar Notificação que cancela a notificação sendo exibida. O botão chama o método cancelaNotificacao() que cancela a notificação, passando para o método cancel(int) a constante NOTIFICACAO_TESTE que foi criada para identificar a notificação. Este método também apaga a lista de mensagens que foi criada para armazenar cada mensagem gerada.
    private void cancelaNotificacao(){
        
        // Cancela a notificação 
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService
                (Context.NOTIFICATION_SERVICE);
        
        mNotificationManager.cancel(NOTIFICACAO_TESTE);
        
        // Apaga a lista de mensagens 
        listaMensagens.clear();

    }