JavascriptProva

domenica 3 aprile 2016

I Broadcast in Android

Credo che sia il caso di occuparsi dei Broadcast.

Ecco: come al solito il processo di apprendimento è stato piuttosto laborioso e sofferto, ma sono venuto a capo di qualcosa...

Abbiamo un Intent che viene mandato come Broadcast e un BroadcastReceiver che ne è il ricevitore e deve essere registrato.
Ho già scritto tutto il codice, ma come al solito rompo tutto come se fosse un "Mandala" buddhista e mi esercito a riscriverlo, perché così mi si facilita la ritenzione in memoria:
  receiver=new BroadcastReceiver(){

   @Override
   public void onReceive(Context context, Intent intent) {
    Log.d("BROADCAST","RICEVUTO");
    
   }
   
  };
Finora ho scritto questo, che è il codice di un BroadcastReceiver elementare, nel contesto del metodo onCreate.

Quindi questo ricevitore esegue un'azione (scrive in LogCat le stringhe "BROADCAST" e "RICEVUTO") e stop.
Ora, dunque, bisogna registrarlo, e nella registrazione si specifica l'azione alla quale risponde.
Vediamo se ci riesco:
  IntentFilter filtro=new IntentFilter();
  filtro.addAction("azione");
  
  registerReceiver(receiver,filtro);
Le prime due righe definiscono il filtro dell'azione alla quale deve rispondere il receiver, la seconda registra il receiver con il suo filtro per l'azione.
Ecco il codice finora scritto:
public class MainActivity extends Activity {
 
 BroadcastReceiver receiver;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  receiver=new BroadcastReceiver(){

   @Override
   public void onReceive(Context context, Intent intent) {
    Log.d("BROADCAST","RICEVUTO");
    
   }
   
  };
  
  IntentFilter filtro=new IntentFilter();
  filtro.addAction("azione");
  
  registerReceiver(receiver,filtro);
 }
}
Ecco tutto: ho scritto, in parole semplici, quello che fa il broadcastReceiver quando riceve il broadcast, e il broadcast al quale risponde.

In parole semplici, mentre l'intent normalmente è una chiamata personale a qualcun altro, il broadcast è mettersi in piazza e urlare per farsi sentire da tutti. Se poi fra i passanti ce ne sono alcuni che sono disposti ad accogliere il messaggio si metteranno in azione, mentre gli altri lo ignoreranno.
Esempio dalla vita pratica: c'è in piazza uno che si sente male, e il suo amico che stava vicino a lui vede tra la folla un suo amico medico, così va da lui e lo chiama per farlo accorrere (Intent); oppure può capitare che non ci sia nessun medico conosciuto nelle vicinanze, e così l'amico si mette a urlare a squarciagola verso la folla: "EHI! QUI C'E' UNO CHE STA MALE, C'E' UN MEDICO?" (Broadcast).
Ecco, finora ho definito il medico e il richiamo al quale risponde.
Ora diamo voce all'amico dell'ammalato: si fa con un Intent:
  Intent intent=new Intent();
  intent.setAction("azione");
  sendBroadcast(intent);
Ecco, vediamo se funziona...

Funziona!
04-03 09:42:32.952: D/BROADCAST(3045): RICEVUTO



E adesso per gioco voglio mimare la situazione del malore che mi sono fatto come esempio:
public class MainActivity extends Activity {
 
 BroadcastReceiver medico;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  
  medico=new BroadcastReceiver(){

   @Override
   public void onReceive(Context context, Intent intent) {
    Log.d("ECCOMI","COS'E' SUCCESSO?");
   }
   
  };
  
  IntentFilter filtro=new IntentFilter();
  filtro.addAction("c'è un medico?");
  registerReceiver(medico,filtro);
  
  Intent intent=new Intent();
  intent.setAction("c'è un medico?");
  sendBroadcast(intent);
  
 }
 
 protected void onDestroy(){
  super.onDestroy();
  unregisterReceiver(medico);
 }
  


}
...aggiungendo la de-registrazione del receiver con il metodo onDestroy, sempre doverosa!

1 commento:

  1. Ci sarebbe ancora un'aggiunta da fare per rimaracere meglio la differenza...

    RispondiElimina