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!