Einführung
Broadcast (Broadcast) ist eine der vier Hauptkomponenten von Android für die Kommunikation zwischen Prozessen/Threads.
Das größte Merkmal des Rundfunks ist, dass es dem Sender egal ist, ob der Empfänger die Daten empfängt oder wie der Empfänger die Daten verarbeitet, sondern nur für das „Sprechen“ zuständig ist, unabhängig davon, ob Sie „zuhören“ oder nicht.
Broadcasts können vom System kommen, beispielsweise sendet das Android-System Broadcasts, wenn verschiedene Systemereignisse auftreten (wenn das System hochfährt oder wenn das Gerät mit dem Aufladen beginnt).
Es kann auch von anderen Anwendungen kommen.Anwendungen können beispielsweise auch benutzerdefinierte Broadcasts senden, um andere Anwendungen zu benachrichtigen, dass sie Inhalte akzeptieren (Daten aktualisieren), an denen sie interessiert sein könnten.
Inhaltsverzeichnis
Klassifizierung des Rundfunks
Klassifiziert nach Sendemethode
-
Standardsendung
Es handelt sich um eine "völlig asynchrone Ausführung"-Sendung ohne jede Sequenz.Alle Broadcast-Empfänger empfangen diese Broadcast-Nachricht fast zur gleichen Zeit, was hocheffizient ist und nicht abgeschnitten werden kann.
-
geordnete Sendung
Es handelt sich um eine "Synchronausführung"-Sendung, die eine Sequenz hat. Nur ein Empfänger kann diese Broadcast-Nachricht gleichzeitig empfangen. Der Broadcast-Empfänger mit höherer Priorität kann die Broadcast-Nachricht zuerst empfangen, und der vorherige Broadcast-Empfänger kann auch die aktuelle abfangen Broadcast-Nachricht Die gesendete Broadcast-Nachricht, sodass der nachfolgende Broadcast-Empfänger die Broadcast-Nachricht nicht empfangen kann.
Klassifiziert nach Registrierungsmethode
-
statische Übertragung
Das Abhören erfolgt unabhängig davon, ob die Anwendung aktiv ist oder nicht. Jeder Trigger erstellt ein neues Empfängerobjekt.
-
dynamische Übertragung
Registrierung im Code Beachten Sie, dass die Registrierung des dynamisch registrierten Broadcasts aufgehoben werden muss, normalerweise onDestroy()
durch Aufrufen unregisterReceiver()
der Methode in der Methode.
Derselbe Empfänger wird von der Erstellung bis zur Aufhebung der Registrierung verwendet, unabhängig davon, wie oft die Übertragung ausgelöst wird.
Per Definition klassifizieren
-
Systemübertragung
Im Android-System sind mehrere System-Broadcasts integriert, und jeder System-Broadcast hat einen bestimmten IntentFilter, der hauptsächlich eine bestimmte Aktion enthält. Nachdem der System-Broadcast gesendet wurde, wird er vom entsprechenden BroadcastReceiver empfangen. Systembroadcast wird automatisch vom System gesendet, wenn ein bestimmtes Ereignis im System auftritt.
-
benutzerdefiniertes Radio
Broadcasts, die von Anwendungsentwicklern selbst definiert werden.
Klassifiziert nach Geltungsbereich
-
weltweit ausgestrahlt
Ausgesendete Rundsendungen können von jeder anderen Anwendung empfangen werden oder können Rundsendungen von jeder anderen Anwendung empfangen.
-
lokale Sendung
Broadcasts können nur innerhalb der Anwendung bereitgestellt werden, und Broadcast-Empfänger können nur interne Broadcasts empfangen und keine Broadcasts von anderen Anwendungen annehmen.
Nutzung des Rundfunks
Rundfunkempfänger erstellen
Um Broadcasting zu verwenden, müssen wir zuerst einen BroadcastReceiver (Broadcast-Empfänger) erstellen und BroadcastReceiver direkt erben, um eine Unterklasse zu erstellen und onReceive()
die Methode , wie im folgenden Beispielcode gezeigt.
öffentliche Klasse MyReceiver erweitert BroadcastReceiver { // benutzerdefinierte Aktion Private Static Final String ACTION = "com.jeanboy.broadcast.MyReceiverFilter"; @Überschreiben public void onReceive (Kontextkontext, Absichtsabsicht) { //TODO: Broadcast zur Verarbeitung empfangen } }
statische Übertragung
Bei der Verwendung von Broadcasting muss es auch in der AndroidMainfest-Datei definiert werden, dh statisches Broadcasting registrieren.
<receiver android:name=".ui.broadcast.MyReceiver" android:enabled="true" android:exported="true"> <Absichtsfilter> <!-- Zum Beispiel: Broadcast zum Systemstart empfangen --> <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- Zum Beispiel: einen benutzerdefinierten Broadcast empfangen --> <action android:name="com.jeanboy.broadcast.MyReceiverFilter" /> </intent-filter> </Empfänger>
Die Einstellung „enabled“ oben auf „true“ bedeutet, dass Broadcast-Informationen empfangen werden können. Exportiert ist wahr bedeutet, dass es die von einem externen APK gesendeten Broadcast-Informationen empfangen kann.
dynamische Übertragung
Die Nutzung von Dynamic Broadcasting muss nicht in der AndroidMainfest-Datei definiert, sondern nur im Code eingetragen werden.
// Sendung erstellen MyReceiver myReceiver = new MyReceiver(); // IntentFilter erstellen Absichtsfilter absichtsfilter = neuer absichtsfilter(); // Zum Beispiel: System-Broadcast-Aktion hinzufügen, um Netzwerkänderungen zu akzeptieren intentionFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // Zum Beispiel: benutzerdefinierte Aktion hinzufügen intentionFilter.addAction(MyReceiver.ACTION); // Übertragung registrieren registerReceiver(meinEmpfänger, IntentFilter); // Broadcast abmelden unregisterReceiver(myReceiver);
Sendung senden
Das Senden von Broadcasts ist relativ einfach, unabhängig von statischen Broadcasts oder dynamischen Broadcasts, die Methode ist wie folgt (System-Broadcasts werden automatisch vom Android-System gesendet, was nicht Gegenstand dieses Artikels ist).
// Absicht erstellen Absicht Absicht = neue Absicht (); // Zum Beispiel: benutzerdefinierte Aktion hinzufügen intention.setAction(MyReceiver.ACTION); // Sendung senden sendBroadcast(Absicht);
Statische Sendungen in Android 8.0
Da Android 8.0 die meisten statischen Broadcasts abschafft, müssen einige Teile des Codes modifiziert werden.
Der sendende Broadcast-Teil erfordert eine Einrichtung ComponetName
.
Absicht Absicht = neue Absicht (MyReceiver.ACTION); // ComponetName("Name des benutzerdefinierten Broadcast-Pakets", "Benutzerdefinierter Broadcast-Pfad") Komponentenname Komponente = neuer Komponentenname("com.jeanboy.app.broadcast", "com.jeanboy.app.broadcast.MyReceiver"); intention.setComponent (Komponente); sendBroadcast(Absicht);
Sendung mit Genehmigung
Sicherheitsprobleme, die bei der Verwendung von Broadcasts auftreten können:
-
Wenn andere Anwendungen unsere Sendung abhören, führt dies zu einem Datenverlust unserer Anwendung.
-
Wenn eine andere Anwendung vorgibt, unsere Anwendung zum Senden von Sendungen zu sein, startet sie häufig unser Sendungsempfangsprogramm, was zu Verwirrung oder sogar zum Absturz unserer Anwendung führt.
Um die oben genannten Sicherheitsprobleme zu vermeiden, stellt uns Android einen Berechtigungsmechanismus zur Verfügung.
Erstens können Sie Berechtigungen in der AndroidMainfest-Datei hinzufügen, wenn Sie statisches Broadcasting registrieren.
<manifestieren ...> <!-- Passen Sie Ihre eigenen Berechtigungen an --> <permission android:name="com.jeanboy.permissions.MY_BROADCAST"/> <!-- Benutzerdefinierte Berechtigungen verwenden --> <uses-permission android:name="com.jeanboy.permissions.MY_BROADCAST"/> <Anwendung ...> <!-- Berechtigungen hinzufügen --> <receiver android:name=".ui.broadcast.MyReceiver" android:permission="com.jeanboy.broadcast.MY_BROADCAST" android:enabled="true" android:exported="true"> <Absichtsfilter> <!-- Zum Beispiel: einen benutzerdefinierten Broadcast empfangen --> <action android:name="com.jeanboy.broadcast.MyReceiverFilter" /> </intent-filter> </Empfänger> </Anwendung> </manifest>
Wenn wir dann eine Sendung senden, können wir eine Berechtigung dafür festlegen, und nur die App mit dieser Berechtigung kann die Sendung empfangen, wie unten gezeigt:
// Absicht erstellen Absicht Absicht = neue Absicht (); // Zum Beispiel: benutzerdefinierte Aktion hinzufügen intention.setAction(MyReceiver.ACTION); // Sendung senden, Berechtigungen hinzufügen sendBroadcast(intent, "com.jeanboy.permissions.MY_BROADCAST");
lokale Sendung
Der oben beschriebene BroadcastReceiver dient zum Übertragen von Nachrichten zwischen Anwendungen, ist im Wesentlichen prozessübergreifend und kann von anderen Anwendungen abgefangen werden.
Der LocalBroadcast (lokaler Broadcast) dient der Übertragung von Nachrichten innerhalb der Anwendung, was effizienter als BroadcastReceiver ist, nur innerhalb der Anwendung gültig ist und keine Sicherheitsaspekte berücksichtigen muss.
Die Erstellung des lokalen Broadcasts ist immer noch an BroadcastReceiver zu erben, um eine Unterklasse zu erstellen und onReceive()
die Methode . Verwenden Sie LocalBroadcastManager, um verwandte Vorgänge beim Registrieren, Senden und Aufheben der Registrierung von Broadcasts auszuführen.
// Sendung erstellen MyReceiver myReceiver = new MyReceiver(); // IntentFilter erstellen Absichtsfilter absichtsfilter = neuer absichtsfilter(); // Zum Beispiel: benutzerdefinierte Aktion hinzufügen intentionFilter.addAction(MyReceiver.ACTION); // lokalen Broadcast registrieren LocalBroadcastManager.getInstance(dies) .registerReceiver(meinEmpfänger, IntentFilter); // Sendung senden Intent Intent = new Intent(MyReceiver.ACTION)); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); // Lokale Sendung abmelden LocalBroadcastManager.getInstance(this).unregisterReceiver(myReceiver);