Android Local Broadcast (LocalBroadcastManager)
Wichtiger Hinweis:
LocalBroadcastManagerist in AndroidX veraltet (deprecated). Offiziell wird für die App-interne KommunikationLiveDataoderFlowempfohlen, aber in Vorstellungsgesprächen wird es immer noch abgefragt.
1. Was ist ein Local Broadcast (im Vergleich zum Global Broadcast)?
Global Broadcast (sendBroadcast / sendOrderedBroadcast, siehe vorherige Lektionen)
- Läuft über das System-AMS, übergreifend für Apps, alle Apps können diesen Broadcast empfangen
- Sicherheitsrisiko: Daten können leicht von anderen Apps abgefangen werden; andere Apps können gefälschte Broadcasts senden, um unsere App anzugreifen
Local Broadcast – LocalBroadcastManager
- Der Broadcast verbleibt innerhalb der aktuellen App und durchläuft nicht den globalen System-Broadcast-Mechanismus; andere Apps können ihn überhaupt nicht empfangen ✅ Vorteile:
- Sicher: Der Broadcast gelangt nicht nach außen, externe Apps können keine gefälschten Broadcasts senden
- Effizient: Keine Inter-Prozess- oder AMS-Kommunikation nötig, daher schneller
- Keine Berechtigungen erforderlich Einschränkungen:
- Nur dynamische Registrierung; statische Registrierung (im AndroidManifest) ist ungültig
- Funktioniert nur innerhalb derselben App; keine Übergänge zwischen Prozessen oder Apps möglich
- Kann nicht zusammen mit System-Broadcasts verwendet werden
2. Vollständige Code-Erklärung
2.1 Eigener Receiver MyReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "Lokalen Broadcast empfangen", Toast.LENGTH_LONG).show();
}
}
Code-Sprache: PHP (php)
2.2 Verwendung von LocalBroadcastManager in der 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; // Referenz auf den Local Broadcast Manager
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Singleton-Instanz des LocalBroadcastManager abrufen
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.btn_send);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// Intent-Aktion erstellen und lokalen Broadcast senden
Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
// Lokalen Broadcast-Receiver dynamisch registrieren
intentFilter = new IntentFilter();
intentFilter.addAction("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
myReceiver = new MyReceiver();
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// Zwingend abmelden! Speicherlecks vermeiden
localBroadcastManager.unregisterReceiver(myReceiver);
}
}
Code-Sprache: JavaScript (javascript)
Wichtige APIs:
LocalBroadcastManager.getInstance(context): Instanz abrufen (Singleton)registerReceiver(receiver, intentFilter): Receiver dynamisch registrierensendBroadcast(intent): Ungeordneten lokalen Broadcast senden;sendOrderedBroadcast()für geordneten lokalen BroadcastunregisterReceiver(): Registrierung beim Zerstören der Seite aufheben — muss zwingend gemacht werden, sonst Speicherleck-Gefahr
3. Vergleich: Local Broadcast vs. Global Unordered Broadcast vs. Global Ordered Broadcast
| Typ | Kommunikationsbereich | Übergreifend | Unterbrechbar | Registrierung | Unterliegender Mechanismus |
|---|---|---|---|---|---|
| Globaler ungeordneter Broadcast sendBroadcast | Global | Ja | Nicht abbrechbar | Statisch + Dynamisch | System-AMS, Inter-Prozess |
| Globaler geordneter Broadcast sendOrderedBroadcast | Global | Ja | Mit abortBroadcast abbrechbar | Statisch + Dynamisch | System-AMS, Inter-Prozess, seriell nach Priorität |
| Lokaler Broadcast LocalBroadcastManager | Innerhalb der App | Nein | Unterstützt Abbruch bei geordneten Broadcasts | Nur dynamisch | In-Memory-Verteilung, ohne AMS, hohe Effizienz |
Android Local Broadcast
Previous: Geordneter Broadcast