Como Exibir uma Notificação no Android

O sistema de notificação do Android é uma maneira de informar os eventos importantes que aconteceram, a interface permite visualizar e interagir com a aplicação que gerou a notificação, no momento que for mais conveniente.

Para criar uma notificação no Android pode ser utilizada a classe NotificationCompat.Builder para versões de Android a partir da API 4 (Android 1.6), e a classe Notification.Builder a partir da API 11 (Android 3.0). No exemplo deste post e toda a descrição para criação de notificação foi utilizada a classe Notification.Builder, e o projeto foi elaborado para exibir notificação nos dispositivos com Android versão 4.1 ou superior.

Como Criar a Notificação


Para criar uma notificação em dispositivos com API 11 ou superior, é necessário instanciar a classe a Notification.Builder, configurar os parâmetros obrigatórios e chamar o método build(), que irá retornar um objeto tipo Notification.

O objeto Notification deve ter no mínimo:
  • Um ícone
  • Um título
  • Um texto para notificação
Apesar das ações a serem executadas serem opcionais, é interessante incluir pelo menos uma ação que deve ser executada quando o usuário selecionar a notificação. Um exemplo de ação bem comum é abrir uma aplicação.

Na classe Notification a ação é definida através da classe PendingIntent, que retorna um objeto Intent e  pode inicializar uma Activity.

A classe Notification permite que seja definido um nível de prioridade no qual a notificação é exibida, comparada com outras notificações, o que garante que as notificações mais importantes sejam exibidas primeiro.

Os nível de notificação possíveis são:
  • Notification.PRIORITY_DEFAULT: Nível padrão de notificação, onde a prioridade não é definida. 
  • Notification.PRIORITY_HIGH: Notificação de alta prioridade utilizada para fazer comunicações importantes, como por exemplo mensagens.
  • Notification.PRIORITY_LOW: Notificação de prioridade baixa, onde o usuário precisa ficar ciente, mas que não apresenta nenhuma urgência.
  • Notification.PRIORITY_MAX: Notificação considerada crítica ou urgente, que depende do fator tempo e deve ser resolvida antes de alguma outra tarefa.
  • Notification.PRIORITY_MIN: Notificação de prioridade mínima que o usuário precisa ficar ciente, mas não apresenta nenhuma urgência, como por exemplo previsão do tempo. As notificações com prioridade mínima não são apresentadas na barra de status, somente são visíveis quando o usuário acessa a bandeja de notificações.

Criando a Notificação

Para demonstrar como exibir uma notificação criei um projeto que avisa quando foi alterado o modo de conexão do dispositivo, de conexão normal para conexão modo avião ou vice versa. No modo avião o dispositivo não tem acesso ao sinal de telefone, rede e rádio.

Quando o modo de conexão é alterado, uma notificação é exibida na barra de status do dispositivo. Esta notificação quando selecionada apresenta uma tela, com um texto explicando como verificar se o dispositivo está em modo avião.

Para este exemplo foram criadas duas classes no projeto da aplicação Android. A classe PrincipalActivity() utilizada para exibir a tela com o texto explicativo do modo de conexão, e a classe IniciarAplicaçao() utilizada para criar a notificação e definir qual a Activity será exibida quando a notificação for selecionada.

Para verificar se o modo de conexão foi alterado utilizei um BroadcastReceiver que foi registrado na ação android.intent.action.AIRPLANE_MODE. Para ver um exemplo completo de como criar e utilizar um BroadcastReceiver acesse o post Utilizando BroadcastReceiver para Iniciar uma Aplicação.

O registro do BroadcastReceiver foi feito no arquivo AndroidManifest.xml. Este código deve ser inserido dentro da tag <application/>.

      <!-- Publicação do Broadcast -->
      <receiver android:name=".IniciarAplicacao">
          <intent-filter>
              <action android:name="android.intent.action.AIRPLANE_MODE" />
              <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>
      </receiver>
A classe IniciarAplicacao() que foi registrada no arquivo AndroidManifest.xml estende a classe BroadcastReceiver e sobrescreve o método onReceive(), que é executado no momento em que o modo de conexão do dispositivo é alterado. Este método cria a notificação que será exibida na barra de status do dispositivo.
public class IniciarAplicacao extends BroadcastReceiver {

  public static final int ALTEROU_MODO_CONEXAO = 1;
  @Override
  public void onReceive(Context ctx, Intent i) {

    // Cria a notificação com as informações de
    // ícone, título, prioridade e texto
    Notification.Builder mBuilder =
            new Notification.Builder(ctx)
            .setSmallIcon(R.drawable.ic_notification_romar)
            .setContentTitle("Modo avião")
            .setPriority(Notification.PRIORITY_DEFAULT)
            .setContentText("Foi alterado o modo de conexão do " +
                "celular.");
   
    // Cria o intent que vai ser chamado quando a notificação
    // for selecionada. Neste caso exibe a Activity PrincipalActivity
    Intent resultIntent = new Intent(ctx, PrincipalActivity.class);

    // Cria uma pilha de tarefas para garantir que a navegação a
    // partir da Activity chamada pela notificação, retorne para
    // a tela principal do Android, quando selecionado o botão voltar
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(ctx);
    stackBuilder.addParentStack(PrincipalActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                0,
                PendingIntent.FLAG_UPDATE_CURRENT
            );
    mBuilder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager =
        (NotificationManager) ctx.getSystemService
        (Context.NOTIFICATION_SERVICE);
   
    // A constante ALTEROU_MODO_CONEXAO é uma identificação
    // que pode ser utilizada para atualizar a notificação posteriormente
    mNotificationManager.notify(ALTEROU_MODO_CONEXAO, mBuilder.build());
  }
}

Durante a criação da notificação é definido um Intent para que seja exibida uma Activity, com as informações de como verificar se o dispositivo está em modo avião, portanto  foi criada a classe PrincipalActivity(), cujo método onCreate(Bundle) exibe a informação em um TextView.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_principal);
       
        TextView textView = (TextView)findViewById(R.id.textview);
        textView.setText("O modo de conexão do celular foi alterado. " +
        "Se o ícone de conexão for um avião, o celular está " +
            "sem sinal de telefone, rede e/ou rádio.");
    }

Exibindo a Notificação

Depois de instalada a aplicação no dispositivo, feche a aplicação e nas configurações do dispositivo altere o modo de conexão para modo avião. Quando o dispositivo alterar o modo de conexão, será apresentada na barra de status o ícone da notificação (letra R).
notificacao1
Quando a notificação é visualizada na bandeja será exibido o ícone da notificação (letra R), o título e o texto.
notificacao2
Quando a notificação é selecionada será apresentada a tela com as informações de como verificar se o dispositivo está em modo avião.
notificacao3