Was ist eine Sticky-Sendung?

89

Ich bin auf diesen Begriff in der Android-Dokumentation mit der zugehörigen Definition gestoßen

Hierbei handelt es sich um Broadcasts, deren Daten nach Abschluss vom System gespeichert werden, sodass Clients diese Daten schnell abrufen können, ohne auf die nächste Broadcast warten zu müssen.

Was heißt das? Kann jemand seine Verwendung anhand eines bestimmten Beispiels erläutern? Ich glaube, wir müssen eine Erlaubnis beantragen, um diese Absicht zu nutzen. Warum so?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.
Shouvik
quelle
3
08 / Feb / 2019, für alle, die eine klebrige Sendung suchen und hier enden, vom offiziellen Dokument Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.
Fangzhzh

Antworten:

110

Wenn eine Aktivität onPausemit einer normalen Sendung anruft , kann der Empfang der Sendung verpasst werden. Eine Sticky-Sendung kann nach dem Start in überprüft werden onResume.

Update 23.06.2020

Sticky-Sendungen sind veraltet.

Siehe sendStickyBroadcastDokumentation .

Diese Methode wurde in API-Level 21 nicht mehr unterstützt.

Sticky Broadcasts sollten nicht verwendet werden. Sie bieten keine Sicherheit (jeder kann darauf zugreifen), keinen Schutz (jeder kann sie ändern) und viele andere Probleme. Das empfohlene Muster besteht darin, eine nicht klebrige Sendung zu verwenden, um zu melden, dass sich etwas geändert hat, und einen anderen Mechanismus für Apps, um den aktuellen Wert bei Bedarf abzurufen.

Implementieren

Intent intent = new Intent("some.custom.action");
intent.putExtra("some_boolean", true);
sendStickyBroadcast(intent);

Ressourcen

Paul Burke
quelle
Hallo, ich bin verwirrt mit Sticky Broadcast mit der statischen Registrierung der Sendung. Ich habe gerade irgendwo gelesen, dass der Unterschied zwischen der Registrierung einer Sendung in der Manifestdatei und der programmgesteuerten Registrierung nur darin besteht, dass die weitere die Registrierung nicht aufhebt, sondern dort bleibt, während die spätere die Registrierung in der onPause () -Methode aufhebt.
Shaista Naaz
Hinweis: In den meisten Fällen sollten klebrige Sendungen vermieden werden. Siehe den Link in der Antwort von @Nikhil_Katre für weitere Informationen
gMale
@Shaista: Manifest-Empfänger funktionieren auch dann, wenn Ihre App inaktiv ist, während ein programmatischer Empfänger nur reagiert, wenn die Anwendung ausgeführt wird, in der er registriert ist
gMale
@gmale Also, wenn wir Aktivität sind und in onPause () sind und unregisterReceiver () aufgerufen haben. Werden wir die Sendung erhalten, wenn wir in onResume ()
Kushal
1
@PaulBurke Ich habe den Namen Mark Murphy im oben angegebenen Link nicht gefunden. Dieser Link leitet mich zu der Frage weiter, die nicht genau beantwortet wurde. Können Sie bitte die URL aktualisieren?.
Vishal Chhodwani
11

sendStickyBroadcast()führt eine sendBroadcast(Intent)so genannte Sticky-Funktion aus, dh die Absicht, die Sie senden, bleibt nach Abschluss der Übertragung bestehen, sodass andere Benutzer diese Daten schnell über den Rückgabewert von abrufen können registerReceiver(BroadcastReceiver, IntentFilter). In allen anderen Fällen verhält sich dies genauso wie sendBroadcast(Intent). Ein Beispiel für eine Sticky-Sendung, die über das Betriebssystem gesendet wird, ist ACTION_BATTERY_CHANGED. Wenn Sie registerReceiver()diese Aktion aufrufen - auch mit einer Null BroadcastReceiver- erhalten Sie die Absicht, die zuletzt für diese Aktion gesendet wurde. Daher können Sie dies verwenden, um den Zustand der Batterie zu ermitteln, ohne sich unbedingt für alle zukünftigen Zustandsänderungen in der Batterie registrieren zu müssen.

Narendra Motwani
quelle
8

Der Wert einer Sticky-Sendung ist der Wert, der zuletzt gesendet wurde und derzeit im Sticky-Cache gespeichert ist. Dies ist nicht der Wert einer Sendung, die gerade empfangen wurde. Ich nehme an, Sie können sagen, es ist wie ein Browser-Cookie, auf das Sie jederzeit zugreifen können. Die Sticky-Sendung ist jetzt gemäß den Dokumenten für Sticky-Broadcast-Methoden ( z. B. ) veraltet :

Diese Methode wurde in API-Level 21 nicht mehr unterstützt. Sticky-Broadcasts sollten nicht verwendet werden. Sie bieten keine Sicherheit (jeder kann darauf zugreifen), keinen Schutz (jeder kann sie ändern) und viele andere Probleme. Das empfohlene Muster besteht darin, eine nicht klebrige Sendung zu verwenden, um zu melden, dass sich etwas geändert hat, und einen anderen Mechanismus für Apps, um den aktuellen Wert bei Bedarf abzurufen.

Lou Morda
quelle
3

Eine normale Broadcast-Absicht ist nicht mehr verfügbar, nachdem sie vom System gesendet und verarbeitet wurde. Wenn Sie die sendStickyBroadcast (Intent) -Methode verwenden, bleibt die Absicht erhalten, was bedeutet, dass die von Ihnen gesendete Absicht nach Abschluss der Übertragung erhalten bleibt.

Sie verweisen auf meinen Blog: Geben Sie hier die Linkbeschreibung ein

Arul Pandian
quelle
1
Ich habe die erforderliche Offenlegung Ihrer Urheberschaft für den Blog hinzugefügt, auf den Sie verlinken. Sie müssen dies von nun an selbst tun, oder Ihre Beiträge können als Spam gelöscht werden.
Andrew Barber