Link

GitHub

Callback

Una devolución de llamada o callback no es más que una función que se pasa como parámetro y se ejecuta dado el caso de forma asíncrona. Vamos a hacer un ejemplo tomando como base el BroadcastReceiver del tema anterior.

Recepción de SMS y callback

En el tema anterior, mediante un BroadcastReceiver, se detectaba cuando el dispositivo recibía un SMS y se mostraba un Toast. Ahora vamos a hacer que comunique esta llegada a la actividad principal mediante un callback y lo muestre en un TextView.

Pasos que se deben seguir:

1. Crear la interface en el BroadcastReceiver:

public interface Respuesta {
    //Los métodos en las interfaces solo están declarados
    public void onRespuesta(String s);
}

2. En el método onReceive(), definir la variable respuesta:

...
respuesta = (Respuesta) context;
respuesta.onRespuesta("Callback!!");
...

3. En la actividad principal, definir la interface:

public class MainActivity extends AppCompatActivity implements Receptor.Respuesta {
  ...
}

4. En la actividad principal, implementar el método:

@Override
public void onRespuesta(String s) {
    textView.setText(s);
}

Y con esto debería de comunicar el BroadcastReceiver cuando recibe un mensaje a una actividad, en este caso la actividad Main.

Nota: Cuando registramos el BroadcastReceiver desde el código java tal que así:

Receptor receptor = new Receptor();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
this.registerReceiver(receptor, filter);

No es necesario volver a definirlo en el fichero manifiesto. Si se definen ambos se estarían registrando dos BroadcastReceiver provocando un malfuncionamiento.