JavascriptProva

Visualizzazione post con etichetta Broadcast. Mostra tutti i post
Visualizzazione post con etichetta Broadcast. Mostra tutti i post

venerdì 8 aprile 2016

Due BroadcastReceiver con la stessa Action richiamati da un Intent.

Cosa succede con due BroadcastReceiver aventi la stessa action?

Ho creato un nuovo BroadcastReceiver:
public class receiver2 extends BroadcastReceiver{

 @Override
 public void onReceive(Context context, Intent intent) {
  Log.d("SECONDO BROADCAST", "RICEVUTO");
  
 }

}
Ora lo registro nel Manifest, dove è già registrato quello vecchio:
        <receiver android:name="receiver">
            <intent-filter>
                <action android:name="android.intent.action.Seconda" />
            </intent-filter>
        </receiver>
        
        <receiver android:name="receiver2">
            <intent-filter>
             <action android:name="android.intent.action.Seconda" />
            </intent-filter>
        </receiver> 
Ora uso il sendBroadcast con un Intent che abbia la action comune di ambedue:
  Intent intent=new Intent();
  intent.setAction("android.intent.action.Seconda");
  sendBroadcast(intent);
Vediamo...

Ecco il LogCat: come prevedevo, viene eseguita l'azione di ambedue.
04-08 09:31:29.678: D/BROADCAST(2317): RICEVUTO
04-08 09:31:29.727: W/EGL_emulation(2317): eglSurfaceAttrib not implemented
04-08 09:31:29.728: W/OpenGLRenderer(2317): Failed to set EGL_SWAP_BEHAVIOR on surface 0xa6c05880, error=EGL_SUCCESS
04-08 09:31:29.787: D/SECONDO BROADCAST(2317): RICEVUTO

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!