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:
Postar um comentário