Android – Transmisión local

Android – Transmisiones locales (LocalBroadcastManager)

Recordatorio importante: LocalBroadcastManager está obsoleto en AndroidX. La documentación oficial recomienda usar LiveData o Flow para 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:
  1. Segura: la transmisión no se filtra a apps externas y estas no pueden enviar transmisiones falsas
  2. Eficiente: no requiere comunicación entre procesos ni con el AMS, por lo que es más rápida
  3. No requiere declarar permisos Limitaciones:
  4. Solo registro dinámico; el registro estático (en AndroidManifest) no funciona
  5. Solo funciona dentro de la misma app; no puede cruzar procesos ni apps
  6. 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ámicamente
  • sendBroadcast(intent): enviar una transmisión local sin orden; sendOrderedBroadcast() para transmisión local ordenada
  • unregisterReceiver(): 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

TipoAlcanceEntre appsSe puede interrumpirRegistroMecanismo subyacente
Transmisión global sin orden sendBroadcastGlobalSíNo se puede abortarEstático + DinámicoAMS del sistema entre procesos
Transmisión global ordenada sendOrderedBroadcastGlobalSíSe aborta con abortBroadcastEstático + DinámicoAMS del sistema entre procesos, en serie por prioridad
Transmisión local LocalBroadcastManagerDentro de la appNoSoporta interrupción en transmisiones ordenadasSolo dinámicoDistribución en memoria, sin AMS, alta eficiencia

Android – Transmisión local

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *