Android – Transmissões Locais (LocalBroadcastManager)
Lembrete importante:
LocalBroadcastManagerfoi descontinuado no AndroidX. A recomendação oficial é usarLiveDataouFlowpara 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:
- Segura: a transmissão não vaza para apps externos e estes não podem enviar transmissões falsas
- Eficiente: não exige comunicação entre processos nem com o AMS, sendo mais rápida
- Não requer declaração de permissões Limitações:
- Apenas registro dinâmico; registro estático (no AndroidManifest) é inválido
- Funciona apenas dentro do mesmo app; não cruza processos ou apps
- 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 dinamicamentesendBroadcast(intent): enviar uma transmissão local sem ordem;sendOrderedBroadcast()para transmissão local ordenadaunregisterReceiver(): 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
| Tipo | Alcance | Entre apps | Pode ser interrompida | Registro | Mecanismo subjacente |
|---|---|---|---|---|---|
| Transmissão global sem ordem sendBroadcast | Global | Sim | Não pode abortar | Estático + Dinâmico | AMS do sistema entre processos |
| Transmissão global ordenada sendOrderedBroadcast | Global | Sim | Abortada com abortBroadcast | Estático + Dinâmico | AMS do sistema entre processos, serial por prioridade |
| Transmissão local LocalBroadcastManager | Dentro do app | Não | Suporta interrupção em transmissões ordenadas | Apenas dinâmico | Distribuição em memória, sem AMS, alta eficiência |
Android – Transmissão local
Previous: Broadcast ordenado