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!
Ci sarebbe ancora un'aggiunta da fare per rimaracere meglio la differenza...
RispondiElimina