Cos'è uno Sticky Broadcast?


90

Mi sono imbattuto in questo termine nella documentazione di Android con la definizione di accompagnamento

Si tratta di trasmissioni i cui dati vengono conservati dal sistema dopo essere stati terminati, in modo che i client possano recuperare rapidamente quei dati senza dover attendere la trasmissione successiva.

Cosa significa? Qualcuno può elaborarne l'uso con un esempio particolare? Credo che dobbiamo richiedere un'autorizzazione per utilizzare questo intento? Perchè così?

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

3
08 / Feb / 2019, per chiunque cerchi una trasmissione appiccicosa e 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.
finisca

Risposte:


110

Se un'attività chiama onPausecon una trasmissione normale, la ricezione della trasmissione può essere persa. Una trasmissione persistente può essere controllata dopo che è stata avviata in onResume.

Aggiorna 6/23/2020

Le trasmissioni persistenti sono deprecate.

Vedere la sendStickyBroadcastdocumentazione .

Questo metodo è stato deprecato nel livello API 21.

Le trasmissioni persistenti non dovrebbero essere utilizzate. Non forniscono sicurezza (chiunque può accedervi), nessuna protezione (chiunque può modificarli) e molti altri problemi. Lo schema consigliato è quello di utilizzare una trasmissione non appiccicosa per segnalare che qualcosa è cambiato, con un altro meccanismo per le app per recuperare il valore corrente ogni volta che lo si desidera.

Strumento

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

Risorse


Ciao, mi sto confondendo con la trasmissione appiccicosa con la registrazione statica della trasmissione. Ho appena letto da qualche parte che la differenza tra la registrazione di una trasmissione nel file manifest e la registrazione programmatica è solo che l'ulteriore non annulla la registrazione della trasmissione ma rimane lì, mentre il successivo annulla la registrazione della trasmissione nel metodo onPause ().
Shaista Naaz

Nota: nella maggior parte dei casi, le trasmissioni persistenti dovrebbero essere evitate. Vedi il link nella risposta di @Nikhil_Katre per maggiori informazioni
gMale

@Shaista: i ricevitori manifest funzionano anche quando la tua app è inattiva mentre un ricevitore programmatico risponde solo quando l'applicazione in cui è registrato è in esecuzione
gMale

@gmale Quindi, se siamo in attività e siamo in onPause () e abbiamo chiamato unregisterReceiver () .. Avremo la trasmissione quando riprenderemo in onResume ()
Kushal

1
@PaulBurke Non ho trovato il nome Mark Murphy nel link sopra indicato. Questo collegamento mi reindirizza alla domanda, non alla risposta esatta. Puoi aggiornare l'URL?
Vishal Chhodwani

11

sendStickyBroadcast()esegue un sendBroadcast(Intent)noto come sticky, cioè l'intento che stai inviando rimane in giro dopo che la trasmissione è completa, in modo che altri possano recuperare rapidamente quei dati attraverso il valore di ritorno di registerReceiver(BroadcastReceiver, IntentFilter). In tutti gli altri modi, si comporta allo stesso modo di sendBroadcast(Intent). Un esempio di una trasmissione persistente inviata tramite il sistema operativo è ACTION_BATTERY_CHANGED. Quando richiedi registerReceiver()quell'azione, anche con un valore nullo BroadcastReceiver, ottieni l'Intent che è stato trasmesso per l'ultima volta per quell'azione. Quindi, è possibile utilizzarlo per trovare lo stato della batteria senza necessariamente registrarsi per tutti i futuri cambiamenti di stato della batteria.


8

Il valore di una trasmissione adesiva è il valore che è stato trasmesso l'ultima volta ed è attualmente contenuto nella cache adesiva. Questo non è il valore di una trasmissione ricevuta in questo momento. Suppongo che tu possa dire che è come un cookie del browser a cui puoi accedere in qualsiasi momento. La trasmissione persistente è ora deprecata, secondo la documentazione per i metodi di trasmissione persistente ( ad esempio ):

Questo metodo è stato deprecato nel livello API 21. Le trasmissioni persistenti non dovrebbero essere utilizzate. Non forniscono sicurezza (chiunque può accedervi), nessuna protezione (chiunque può modificarli) e molti altri problemi. Lo schema consigliato è quello di utilizzare una trasmissione non appiccicosa per segnalare che qualcosa è cambiato, con un altro meccanismo per le app per recuperare il valore corrente ogni volta che lo si desidera.


3

Un normale intento di trasmissione non è più disponibile dopo che è stato inviato ed elaborato dal sistema. Se utilizzi il metodo sendStickyBroadcast (Intent), l'Intent è appiccicoso, il che significa che l'Intent che stai inviando rimane in giro dopo il completamento della trasmissione.

fai riferimento al mio blog: inserisci qui la descrizione del link


1
Ho aggiunto la richiesta di divulgazione della tua paternità del blog a cui ti colleghi. È necessario farlo da soli da ora in poi, oppure i tuoi post sono soggetti a essere cancellati come spam.
Andrew Barber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.