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

