sexta-feira, 30 de setembro de 2011

Criando uma Notificação a partir do BroadcastReceiver

Olá a todas,
Não é recomendado abrir uma tela quando o BroadcastReceiver recebe uma notificação. Isso porque o usuário pode estar lendo um e-mail importante, vendo um site ou estar na ultima fase de um jogo lutando contra o chefão. Abrir uma tela no meio destas atividades poderia deixar o usuário extremamente irritado. Com isso, as aplicações precisam interagem com o usuário por meio de notificações.

Um dia um amigo meu perguntou: como criar uma notificação a partir de um evento capturado pelo broadcast receiver?
A resposta é simples, é só criar a notificação dentro do método "onReceive" de BroadcastReceiver. Vou mostrar um exemplo.

A Figura abaixo mostra a arquitetura do exemplo e como as mensagens são trocadas.


A classe SendBroadNotifyActivity é uma classe de teste, ela gera um evento que será capturado pela classe BroadcastCallingNotification. Ao capturar este evento o BroadcastCallingNotification cria uma notificação que será apresentado na parte superior do dispositivo do usuário. Cade a ele a decisão de abrir ou não esta notificação.
Caso ele resolva abrir, a activity/tela NotificacaoActivity é exibida na tela.

Neste exemplo as classes NotificacaoActivity e BroadcastCallingNotification estão no mesmo pacote. Abaixo, é exibido o manifest deste pacote. Perceba que existe uma permissão para que a aplicação possa vibrar o celular.


 
 
  
   
    
    
   
  
  
 
 
 



Para criar um evento a ser capturado pela classe BroadcastCallingNotification basta dar um sendBroadcast com a ação BROADCAST_NOTIFY, que foi configurada no manifest. O nome da ação foi eu que escolhi, poderia ser qualquer nome. Abaixo o comando completo.

sendBroadcast(new Intent("BROADCAST_NOTIFY"));

O código da classe BroadcastCallingNotification:
public class BroadcastCallingNotification extends BroadcastReceiver {

  @Override
  public void onReceive(Context contexto, Intent intent) {
   
   String textAviso = "Você recebeu uma mensagem";
   CharSequence titulo = "Androiano";
   CharSequence mensagem = "Exemplo de notificação";
  
   //Configurando o gerenciador de notificação.
   NotificationManager nm = (NotificationManager) contexto.getSystemService(Context.NOTIFICATION_SERVICE);
   Notification n = new Notification(android.R.drawable.stat_notify_chat, textAviso,System.currentTimeMillis());
   
   //Se o usuário selecionar a notificação chama uma activity
   PendingIntent p = PendingIntent.getActivity(contexto, 0, new Intent(contexto,NotificacaoActivity.class), 0);
   
   //Vinculando o PedingIntent com a notificação
   n.setLatestEventInfo(contexto, titulo, mensagem, p);
   
   /** Espera 100, vibra 250, espera 100, vibra 500
    *   Não esquecer de colocar, no manifest, a tagt:
    *   uses-permission android:name="android.permission.VIBRATE" 
    **/
   n.vibrate = new long[]{100,250,100,500};
   
   nm.notify(R.string.app_name,n);
  } }

A classe NotificacaoActivity é a tela que é criada quando o usuário clica na notificação.

public class NotificacaoActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  
  //Fechando a notificação
  NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  nm.cancel(R.string.app_name);
  
  TextView tv = new TextView(this);
  tv.setText("Parabéns você está vendo uma tela que foi gerada por uma notificação");
  setContentView(tv);
  
 }

}

As duas classes acima são as que fazem o trabalho sujo de pegar um evento, criar uma notificação e iniciar uma tela, caso seja o desejo do usuário. Agora vamos ver como fica a classe de teste, ou seja, a classe que cria um evento de broadcast.

Para fazer a classe SendBroadNotifyActivity criei um novo projeto e fiz um layout simples com um botão e um texto. Como você já deve ter imaginado o clique do botão gera o evento de broadcast.

Como é só um botão e um textview, não precisava colocar o layout aqui, porém existe um modo de chamar um botão que nem todos os programadores Android conhecem, é o onClick dentro do XML.


 
 



Verifique a linha android:onClick="buttonClick". Para criar um método que capture o botão é só criar o método:
public void buttonClick(View v){}

Lembrando que buttonClick é o nome que eu dei, você pode dar qualquer nome, mas sempre tem que ter a mesma assinatura no java e no xml, o retorno é void e a proteção é public, com um parâmetro View, senão não funciona.

Por fim a tela de teste:
public class SendBroadNotifyActivity extends Activity {
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }

 //Define buttonClick em android:onClick do botão no XML
 public void buttonClick(View v) {
  sendBroadcast(new Intent("BROADCAST_NOTIFY"));
 }
}

Abaixo estão alguns screenshots do projeto.


[]'s
Androiano

Nenhum comentário: