Android – Transmisiones locales (LocalBroadcastManager)
Recordatorio importante:
LocalBroadcastManagerestá obsoleto en AndroidX. La documentación oficial recomienda usarLiveDataoFlowpara la comunicación dentro de la app, pero sigue apareciendo en entrevistas.
1. ¿Qué es una transmisión local? (Comparación con transmisiones globales)
Transmisión global (sendBroadcast / sendOrderedBroadcast que vimos antes)
- Pasa por el AMS del sistema, entre aplicaciones, todas las apps pueden recibir esta transmisión
- Riesgo de seguridad: los datos pueden ser interceptados fácilmente por otras apps; otras apps también pueden falsificar transmisiones para atacar nuestra app
Transmisión local — LocalBroadcastManager
- La transmisión solo circula dentro de la app actual y no pasa por el mecanismo global del sistema; otras apps no pueden recibirla ✅ Ventajas:
- Segura: la transmisión no se filtra a apps externas y estas no pueden enviar transmisiones falsas
- Eficiente: no requiere comunicación entre procesos ni con el AMS, por lo que es más rápida
- No requiere declarar permisos Limitaciones:
- Solo registro dinámico; el registro estático (en AndroidManifest) no funciona
- Solo funciona dentro de la misma app; no puede cruzar procesos ni apps
- No se puede usar junto con transmisiones del sistema
2. Desglose completo del código
2.1 Receptor personalizado MyReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "Transmisión local recibida", Toast.LENGTH_LONG).show();
}
}
Lenguaje del código: PHP (php)
2.2 Uso de LocalBroadcastManager en la Activity
package cn.bamn.www.localcastdmeo;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager; // Referencia al gestor de transmisiones locales
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Obtener la instancia singleton de LocalBroadcastManager
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.btn_send);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// Construir la acción del Intent y enviar la transmisión local
Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
// Registrar dinámicamente el receptor de transmisión local
intentFilter = new IntentFilter();
intentFilter.addAction("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
myReceiver = new MyReceiver();
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// ¡Obligatorio cancelar el registro! Evita fugas de memoria
localBroadcastManager.unregisterReceiver(myReceiver);
}
}
Lenguaje del código: JavaScript (javascript)
APIs principales:
LocalBroadcastManager.getInstance(context): obtener la instancia (singleton)registerReceiver(receiver, intentFilter): registrar un receptor dinámicamentesendBroadcast(intent): enviar una transmisión local sin orden;sendOrderedBroadcast()para transmisión local ordenadaunregisterReceiver(): cancelar registro al destruir la pantalla — obligatorio, riesgo grave de fuga de memoria
3. Resumen comparativo: Transmisión local vs. Transmisión global sin orden vs. Transmisión global ordenada
| Tipo | Alcance | Entre apps | Se puede interrumpir | Registro | Mecanismo subyacente |
|---|---|---|---|---|---|
| Transmisión global sin orden sendBroadcast | Global | Sí | No se puede abortar | Estático + Dinámico | AMS del sistema entre procesos |
| Transmisión global ordenada sendOrderedBroadcast | Global | Sí | Se aborta con abortBroadcast | Estático + Dinámico | AMS del sistema entre procesos, en serie por prioridad |
| Transmisión local LocalBroadcastManager | Dentro de la app | No | Soporta interrupción en transmisiones ordenadas | Solo dinámico | Distribución en memoria, sin AMS, alta eficiencia |
Android – Transmisión local
Previous: Broadcast ordenado