android - receivers - ¿Cómo usar LocalBroadcastManager?
broadcast receiver android (8)
Cómo cambiar su transmisión global a LocalBroadcast
1) Crear instancia
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
2) Para el registro de BroadcastReceiver
Reemplazar
registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
Con
localBroadcastManager.registerReceiver(new YourReceiver(),new IntentFilter("YourAction"));
3) Para enviar mensaje de difusión.
Reemplazar
sendBroadcast(intent);
Con
localBroadcastManager.sendBroadcast(intent);
4) Para anular el registro de mensajes de difusión.
Reemplazar
unregisterReceiver(mybroadcast);
Con
localBroadcastManager.unregisterReceiver(mybroadcast);
¿Cómo usar / localizar LocalBroadcastManager
como se describe en google docs y Service broadcast doc ?
Traté de buscarlo en Google, pero no hay ningún código disponible para empezar.
Los documentos dicen que debo usarlo si quiero hacer una difusión interna en el proceso de mi aplicación, pero no sé dónde buscar esto.
¿Alguna ayuda / comentario?
Actualización : sé cómo usar Broadcasts pero no sé cómo obtener LocalBroadcastManager
disponible en mi proyecto.
Cuando juegues lo suficiente con LocalBroadcastReceiver, te sugeriré que pruebes el EventBus de Green Robot; definitivamente te darás cuenta de la diferencia y la utilidad en comparación con LBR. Menos código, personalizable sobre el hilo del receptor (UI / Bg), verificando la disponibilidad de los receptores, eventos pegajosos, eventos podrían usarse como entrega de datos, etc.
En Eclipse, eventualmente tuve que agregar Compatibility / Support Library haciendo clic derecho en mi proyecto y seleccionando:
Herramientas de Android -> Añadir biblioteca de soporte
Una vez que se agregó, pude usar la clase LocalBroadcastManager
en mi código.
Prefiero responder de manera integral.
LocalbroadcastManager incluido en Android 3.0 y superior, por lo que tiene que usar la biblioteca de soporte v4 para las primeras versiones. vea las instrucciones here
Crear un receptor de difusión:
private BroadcastReceiver onNotice= new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // intent can contain anydata Log.d("sohail","onReceive called"); tv.setText("Broadcast received !"); } };
Registre su receptor en onResume de actividad como:
protected void onResume() { super.onResume(); IntentFilter iff= new IntentFilter(MyIntentService.ACTION); LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, iff); } //MyIntentService.ACTION is just a public static string defined in MyIntentService.
desregistrar el receptor en onPause:
protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); }
Ahora, cada vez que se envía una difusión local desde la actividad o el servicio de las aplicaciones, se llamará onReceive of onNotice :).
Editar: Puede leer el tutorial completo aquí LocalBroadcastManager: Paso de mensajes de aplicación Intra
También podemos usar la interfaz para el mismo que broadcastManger. Estoy compartiendo el código testd para broadcastManager pero por interfaz.
Primero haz una interfaz como:
public interface MyInterface {
void GetName(String name);
}
2-esta es la primera clase que necesita implementación
public class First implements MyInterface{
MyInterface interfc;
public static void main(String[] args) {
First f=new First();
Second s=new Second();
f.initIterface(s);
f.GetName("Paddy");
}
private void initIterface(MyInterface interfc){
this.interfc=interfc;
}
public void GetName(String name) {
System.out.println("first "+name);
interfc.GetName(name);
}
}
3-aquí está la segunda clase que implementa la misma interfaz cuyo método se llama automáticamente
public class Second implements MyInterface{
public void GetName(String name) {
System.out.println("Second"+name);
}
}
por lo tanto, con este enfoque podemos usar la interfaz que funciona igual que broadcastManager.
Un ejemplo de una Actividad y un Servicio que implementa un LocalBroadcastManager se puede encontrar en los docs desarrollador. Personalmente lo encontré muy útil.
EDITAR: El enlace ha sido eliminado del sitio desde entonces, pero los datos son los siguientes: https://github.com/carrot-garden/android_maven-android-plugin-samples/blob/master/support4demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java
Voy a responder a esto de todos modos. Por si alguien lo necesita.
ReceiverActivity.java
Una actividad que vigila las notificaciones del evento denominado "custom-event-name"
.
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Register to receive messages.
// We are registering an observer (mMessageReceiver) to receive Intents
// with actions named "custom-event-name".
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("custom-event-name"));
}
// Our handler for received Intents. This will be called whenever an Intent
// with an action named "custom-event-name" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Get extra data included in the Intent
String message = intent.getStringExtra("message");
Log.d("receiver", "Got message: " + message);
}
};
@Override
protected void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
SenderActivity.java
La segunda actividad que envía / difunde notificaciones.
@Override
public void onCreate(Bundle savedInstanceState) {
...
// Every time a button is clicked, we want to broadcast a notification.
findViewById(R.id.button_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
// Send an Intent with an action named "custom-event-name". The Intent sent should
// be received by the ReceiverActivity.
private void sendMessage() {
Log.d("sender", "Broadcasting message");
Intent intent = new Intent("custom-event-name");
// You can also include some extra data.
intent.putExtra("message", "This is my message!");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
Con el código anterior, cada vez que se hace clic en el botón R.id.button_send
, se emite un Intent y se recibe por mMessageReceiver
en ReceiverActivity
.
La salida de depuración debería verse así:
01-16 10:35:42.413: D/sender(356): Broadcasting message
01-16 10:35:42.421: D/receiver(356): Got message: This is my message!
Al final de la recepción:
- Primer registro LocalBroadcast Receiver
Luego maneja los datos de intención entrantes en onReceive.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this); lbm.registerReceiver(receiver, new IntentFilter("filter_string")); } public BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent != null) { String str = intent.getStringExtra("key"); // get all your data from intent and do what you want } } };
Al finalizar el envío:
Intent intent = new Intent("filter_string");
intent.putExtra("key", "My Data");
// put your all data using put extra
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);