2010-08-16 5 views
73

Ich kam in dieser Begriff in der Android-Dokumentation mit der begleitenden DefinitionWas ist ein Sticky Broadcast?

Dies sind Sendungen, deren Daten durch das System, nachdem sie fertig gehalten wird, so dass die Kunden schnell, dass die Daten abrufen können, ohne auf die nächste zu warten, Übertragung.

Was bedeutet das? Kann jemand seinen Gebrauch mit einem bestimmten Beispiel ausarbeiten? Ich glaube, wir müssen um Erlaubnis bitten, diese Absicht zu nutzen? Warum?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents. 

Antwort

96

Bitte lesen Mark Murphy Erklärung hier: what is the difference between sendStickyBroadcast and sendBroadcast in Android

Hier ist ein abstraktes Beispiel, wie man eine klebrige Broadcast verwendet werden könnte:

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

Wenn Sie sich für diese Sendung in einer Aktivität hören Das war eingefroren (onPause), Sie könnten das eigentliche Ereignis verpassen. Auf diese Weise können Sie die Übertragung überprüfen, nachdem sie ausgelöst wurde (onResume).

EDIT: Mehr auf klebrige Sendungen ...

Auch removeStickyBroadcast(Intent) Check-out und auf API-Ebene 5 +, isInitialStickyBroadcast() für den Einsatz im Empfänger onReceive.

Hoffe, dass hilft.

+0

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 Manifest-Datei und der programmatischen Registrierung nur darin besteht, dass die weitere Sendung die Registrierung nicht aufhebt, aber sie bleibt dort, während die spätere die Übertragung in onPause() aufhebt. –

+0

Hinweis: In den meisten Fällen sollten störende Übertragungen vermieden werden. Siehe [den Link in der Antwort von @Nikhil_Katre] (http://groups.google.com/group/android-developers/browse_thread/thread/f37e3549a5e1be66?pli=1) für weitere Informationen – gMale

+0

@Shaista: Manifest-Empfänger funktionieren auch wenn Ihre App ist inaktiv, während ein programmatischer Empfänger nur antwortet, wenn die Anwendung, in der er registriert ist, läuft – gMale

20

Bitte beachten Sie, dass Sticky-Übertragungen schwer auf dem System sind und nicht empfohlen werden. Bitte lesen Sie den Hinweis von hackbod in der Diskussion auf 'Sticky Broadcasts and Concurrency Options' in der Android Developers-Gruppe.

@Shouvik, Bitte geben Sie das genaue Szenario an, in dem Sie StickyBroadcasts verwenden möchten. Jemand kann vielleicht eine alternative Lösung vorschlagen.

+0

+1 für den Hinweis auf die Nachteile von Sticky Broadcasts, nicht zu erwähnen, dass, wenn Ihre Anwendung abstürzt (ja, könnte dies passieren, auch wenn Sie alles mit try/catch und registriert ein 'Thread.setDefaultUncaughtExceptionHandler() '), Sie stecken fest mit etwas, das Sie beim nächsten Aufruf sorgfältig behandeln müssen. Kurz gesagt, wie SharedPreferences und ContentProvider könnte es umständlich und zu kompliziert sein. – ateiob

+0

Mit "schwer auf dem System" meinst du es könnte es verlangsamen? Wann ist diese Verlangsamung vorhanden? Während der Anwendung oder sogar ohne es zu laufen? Adobe AIR-Anwendungen müssen nach dieser Berechtigung fragen. Das ist etwas, was Sie nicht vermeiden können, wenn Sie eine AIR-App programmieren, fürchte ich. Entweder Sie fragen dies in Ihrer Anwendung, ob Sie die AIR-Laufzeitumgebung in Ihre App integriert haben oder ob der Benutzer die Adobe AIR-Laufzeitumgebung installiert, die nach dieser Berechtigung fragt. – OMA

+0

Hier ist ein Szenario, das ich versuche zu erreichen, und ich frage mich, ob die Übertragung von Sticks zu erreichen wäre. Ich muss den Status für einen Dienst im Speicher beibehalten, auch wenn der Dienst beendet wird, und ohne externe Ressourcen wie Flash zu berühren. Ich kann dies ohne Stickyness tun, aber laufe in Gleichzeitigkeitsprobleme um, indem ich den Status aktualisiere, wenn Intents Back-to-Back geliefert werden. – Michael

1

Ein normaler Broadcast-Intent ist nicht mehr verfügbar, nachdem die Nachricht vom System gesendet und verarbeitet wurde. Wenn Sie die sendStickyBroadcast (Intent) -Methode verwenden, ist die Absicht "sticky", was bedeutet, dass die Absicht, die Sie senden, nach Abschluss der Übertragung erhalten bleibt.

Sie beziehen sich auf meinem Blog: enter link description here

+1

Ich habe die erforderliche Offenlegung Ihrer Urheberschaft des Blogs hinzugefügt, mit dem Sie verlinken. Sie * müssen * dies jetzt selbst tun oder Ihre Beiträge werden als Spam gelöscht. –

7

sendStickyBroadcast() eine sendBroadcast(Intent) als klebrig bekannt führt, dh die Absicht Sie Aufenthalte um nach der Sendung abgeschlossen ist senden, so dass andere schnell, dass die Daten durch den Rückgabewert abrufen . Auf alle anderen Arten verhält sich das genauso wie sendBroadcast(Intent). Ein Beispiel für eine über das Betriebssystem gesendete Kurzsendung ist ACTION_BATTERY_CHANGED. Wenn Sie registerReceiver() für diese Aktion aufrufen - selbst mit einer Null BroadcastReceiver - erhalten Sie den Intent, der zuletzt für diese Aktion gesendet wurde. Damit können Sie den Zustand der Batterie ermitteln, ohne dass Sie sich für alle zukünftigen Zustandsänderungen der Batterie registrieren müssen.

7

Der Wert eines dauerhaften Broadcasts 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, dass es wie ein Browser-Cookie ist, auf den Sie jederzeit zugreifen können.Die klebrige Sendung ist jetzt veraltet:

Diese Methode wurde in API-Ebene veraltet 21. Sticky Sendungen sollten nicht verwendet werden. Sie bieten keine Sicherheit (jeder kann darauf zugreifen), keine Schutz (jeder kann sie ändern) und viele andere Probleme. Das empfohlene Muster besteht darin, eine nicht-sticky Broadcast zu verwenden, um zu melden, dass sich etwas geändert hat, mit einem anderen Mechanismus für Apps, um den aktuellen Wert wann immer gewünscht abzurufen.

+1

Ein Link zum referenzierten Dokument wäre sehr hilfreich. –

+0

Ich kann mich nicht mehr an referenziertes Dokument erinnern. Ich wusste nicht, dass das eine schlechte SO-Etikette war, aber jetzt kann ich deutlich sehen, warum. Def kopieren und einfügen von irgendwo. –