Android – Transmissão local

Android – Transmissões Locais (LocalBroadcastManager)

Lembrete importante: LocalBroadcastManager foi descontinuado no AndroidX. A recomendação oficial é usar LiveData ou Flow para comunicação dentro do app, mas ainda é cobrado em entrevistas.

1. O que é uma transmissão local (comparada com transmissão global)?

Transmissão global (sendBroadcast / sendOrderedBroadcast vistos anteriormente)

  • Passa pelo AMS do sistema, entre aplicativos, todos os apps podem receber esta transmissão
  • Risco de segurança: dados podem ser facilmente interceptados por outros apps; outros apps também podem forjar transmissões para atacar nosso app

Transmissão local — LocalBroadcastManager

  • A transmissão circula apenas dentro do app atual e não passa pelo mecanismo global do sistema; outros apps não conseguem receber ✅ Vantagens:
  1. Segura: a transmissão não vaza para apps externos e estes não podem enviar transmissões falsas
  2. Eficiente: não exige comunicação entre processos nem com o AMS, sendo mais rápida
  3. Não requer declaração de permissões Limitações:
  4. Apenas registro dinâmico; registro estático (no AndroidManifest) é inválido
  5. Funciona apenas dentro do mesmo app; não cruza processos ou apps
  6. Não pode ser usada junto com transmissões de sistema

2. Explicação completa do código

2.1 Receptor personalizado MyReceiver

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "Transmissão local recebida", Toast.LENGTH_LONG).show();
    }
}
Code language: PHP (php)

2.2 Uso do LocalBroadcastManager na 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; // Referência ao gerenciador de transmissões locais
    private IntentFilter intentFilter;
    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Obter a instância singleton do 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 a ação do Intent e enviar a transmissão local
                Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        // Registrar dinamicamente o receptor de transmissão 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();
        // Obrigatório cancelar o registro! Evita vazamento de memória
        localBroadcastManager.unregisterReceiver(myReceiver);
    }
}
Code language: JavaScript (javascript)

Principais APIs:

  • LocalBroadcastManager.getInstance(context): obter a instância (singleton)
  • registerReceiver(receiver, intentFilter): registrar um receptor dinamicamente
  • sendBroadcast(intent): enviar uma transmissão local sem ordem; sendOrderedBroadcast() para transmissão local ordenada
  • unregisterReceiver(): cancelar registro ao destruir a tela — obrigatório, grande risco de vazamento de memória

3. Resumo comparativo: Transmissão local vs. Transmissão global sem ordem vs. Transmissão global ordenada

TipoAlcanceEntre appsPode ser interrompidaRegistroMecanismo subjacente
Transmissão global sem ordem sendBroadcastGlobalSimNão pode abortarEstático + DinâmicoAMS do sistema entre processos
Transmissão global ordenada sendOrderedBroadcastGlobalSimAbortada com abortBroadcastEstático + DinâmicoAMS do sistema entre processos, serial por prioridade
Transmissão local LocalBroadcastManagerDentro do appNãoSuporta interrupção em transmissões ordenadasApenas dinâmicoDistribuição em memória, sem AMS, alta eficiência

Android – Transmissão local

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *