Dies ist ein Beispiel für die App-übergreifende Kommunikation mit dem BroadcastReceiver, einer der vier Hauptkomponenten von Android. Es verwendet zwei separate Projekte, um zu demonstrieren: App1 sendet einen benutzerdefinierten Broadcast, App2 empfängt ihn.
1. Kernkonzepte
Android-Broadcasts sind ein systemweiter Publish/Subscribe-Nachrichtenmechanismus:
- Broadcasts können app-übergreifend gesendet und empfangen werden; man kann sowohl benutzerdefinierte Broadcasts als auch System-Broadcasts (wie Boot abgeschlossen, Akkuänderungen, Bildschirmsperre) empfangen.
- Testaufbau: Erstellen Sie 2 separate Android-Projekte
- SendDemo: Die Sender-App, die einen benutzerdefinierten Broadcast sendet.
- SendDemo2: Die Empfänger-App, die den Broadcast abhört (dieses Projekt auf dem Screenshot).
2. Empfängercode (SendDemo2)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCastService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Callback wird bei Broadcast-Empfang ausgelöst; zeigt einen Toast an
Toast.makeText(context, "Benutzerdefinierten Broadcast 22222 empfangen", Toast.LENGTH_LONG).show();
}
}
Code-Sprache: JavaScript (javascript)
- Muss
BroadcastReceivererweitern undonReceive()überschreiben. Diese Methode wird automatisch ausgeführt, wenn ein Broadcast empfangen wird. - Hinweis: Führen Sie keine zeitaufwendigen Operationen in
onReceiveaus, da der Lebenszyklus eines Broadcasts sehr kurz ist.
3. Registrierung des Broadcast Receivers (zwei Methoden)
Methode 1: Statische Registrierung (in AndroidManifest.xml registrieren; Empfang auch möglich, wenn die App nicht läuft, aber ab Android 8.0 eingeschränkt)
<receiver android:name=".MyBroadCastService">
<intent-filter>
<!-- Aktionskennung; der Sender muss exakt denselben Aktions-String verwenden -->
<action android:name="com.foxdevelop.MY_CUSTOM_BROADCAST"/>
</intent-filter>
</receiver>
Code-Sprache: HTML, XML (xml)
Wenn SendDemo den Broadcast sendet, muss die Intent-Aktion auf
com.foxdevelop.MY_CUSTOM_BROADCASTgesetzt werden. Beide Seiten müssen übereinstimmen, damit der Broadcast empfangen wird.
Methode 2: Dynamische Registrierung (im Code registrieren; funktioniert nur, während die App läuft)
MyBroadCastService receiver = new MyBroadCastService();
IntentFilter filter = new IntentFilter("com.foxdevelop.MY_CUSTOM_BROADCAST");
registerReceiver(receiver, filter);
Code-Sprache: JavaScript (javascript)
4. Sender (SendDemo) Broadcast-Sende-Code
// App-übergreifenden benutzerdefinierten Broadcast senden
Intent intent = new Intent("com.foxdevelop.MY_CUSTOM_BROADCAST");
sendBroadcast(intent);
Code-Sprache: JavaScript (javascript)
5. Wichtige Hinweise
- Ab Android 8.0 (API 26): Statisch registrierte benutzerdefinierte implizite Broadcasts sind eingeschränkt; viele benutzerdefinierte Aktionen werden bei statischer Registrierung nicht empfangen.
- Lösungen: ① Dynamische Registrierung verwenden; ② Beim Senden des Broadcasts den Paketnamen angeben und einen expliziten Intent verwenden.
- Die meisten System-Broadcasts (Netzwerkänderungen, Akku) können weiterhin normal empfangen werden, wenngleich auch einige System-Broadcasts Einschränkungen unterliegen.
- App-übergreifende Broadcasts bergen Sicherheitsrisiken; Sie können Berechtigungen festlegen, um das Senden und Empfangen zu steuern.
6. Ablauf zur Laufzeit
- Installieren Sie sowohl SendDemo (Sender) als auch SendDemo2 (Empfänger) auf demselben Gerät/Emulator.
- Tippen Sie in SendDemo auf eine Schaltfläche, um
sendBroadcastmit der Aktioncom.foxdevelop.MY_CUSTOM_BROADCASTaufzurufen. - Das System verteilt den Broadcast; jeder BroadcastReceiver, der für diese Aktion registriert ist (MyBroadCastService in SendDemo2), löst sein
onReceiveaus. - SendDemo2 zeigt einen Toast an:
Benutzerdefinierten Broadcast 22222 empfangen.
App-übergreifender Broadcast-Empfang auf Android
Previous: Eigenen Broadcast versenden
Next: Geordneter Broadcast