2010-08-16 16 views
73

mi sono imbattuto in questo termine nella documentazione androide con la definizione di accompagnamentoChe cos'è una trasmissione appiccicosa?

Queste sono le trasmissioni i cui dati si svolge dal sistema dopo essere finito, in modo che i clienti possono recuperare rapidamente i dati, senza dover attendere il prossimo trasmissione.

Che cosa significa? Qualcuno può elaborare il suo uso con un esempio particolare? Credo che dobbiamo chiedere un permesso per usare questo intento? Perchè così?

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

risposta

96

Si prega di leggere la spiegazione di Mark Murphy qui: what is the difference between sendStickyBroadcast and sendBroadcast in Android

Ecco un esempio astratto di come si potrebbe utilizzare un broadcast permanenti:

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

Se si sta ascoltando per questa trasmissione in un'attività che è stato congelato (onPause), potresti perdere l'evento vero e proprio. Ciò consente di controllare la trasmissione dopo che è stata attivata (onRespeso).

EDIT: Maggiori info su broadcast permanenti ...

controllare anche removeStickyBroadcast(Intent), e API Livello 5 +, isInitialStickyBroadcast() per l'utilizzo nel ricevitore del onReceive.

Spero che questo aiuti.

+0

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 quella successiva annulla la registrazione nel metodo onPause(). –

+0

Nota: nella maggior parte dei casi, è consigliabile evitare le trasmissioni appiccicose. Vedi [il link nella risposta di @Nikhil_Katre] (http://groups.google.com/group/android-developers/browse_thread/thread/f37e3549a5e1be66?pli=1) per maggiori informazioni – gMale

+0

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

20

Si prega di notare che le trasmissioni appiccicose sono pesanti sul sistema e sono scoraggiate. Si prega di leggere la nota da hackbod nella discussione su 'Sticky Broadcasts and Concurrency Options' nel gruppo Android Developers.

@Shouvik, specificare lo scenario esatto in cui si sta considerando di utilizzare StickyBroadcasts. Qualcuno potrebbe essere in grado di suggerire una soluzione alternativa.

+0

+1 per sottolineare gli svantaggi delle trasmissioni appiccicose, per non parlare del fatto che se l'applicazione si arresta in modo anomalo (sì, questo potrebbe accadere anche se hai avvolto tutto con try/catch e registrato un 'Thread.setDefaultUncaughtExceptionHandler() '), sei bloccato con qualcosa che devi gestire attentamente al prossimo richiamo. In breve, proprio come SharedPreferences e ContentProvider, potrebbe essere ingombrante e troppo contorto. – ateiob

+0

Con "pesante sul sistema" vuoi dire che potrebbe rallentarlo? Quando è presente questo rallentamento? Durante l'applicazione, o anche senza eseguirlo? Le applicazioni Adobe AIR sono obbligate a chiedere questa autorizzazione, quindi è una cosa che non si può evitare se si programma un'applicazione AIR, temo. O chiedi questo nella tua aplicazione se hai il runtime AIR incorporato nella tua app o fai in modo che l'utente installi il runtime Adobe AIR, che richiede questa autorizzazione. – OMA

+0

Ecco uno scenario che sto cercando di realizzare e mi chiedo se le trasmissioni appiccicose si realizzeranno. Devo mantenere lo stato per un servizio in memoria, anche se il servizio viene ucciso e senza toccare risorse esterne come Flash. Riesco a farlo senza appiccicosità, ma mi imbatto in problemi di concorrenza che aggiornano lo stato se gli intenti vengono consegnati a ritroso. – Michael

1

Un normale evento di trasmissione non è più disponibile dopo che è stato inviato ed elaborato dal sistema. Se si utilizza il metodo sendStickyBroadcast (Intent), l'intent è appiccicoso, il che significa che l'intenzione che si sta inviando rimane in attesa dopo che la trasmissione è stata completata.

vi rimando al mio blog: enter link description here

+1

Ho aggiunto la divulgazione richiesta della tua paternità del blog a cui stai collegando. Devi * farlo * da solo, o i tuoi post sono soggetti ad essere cancellati come spam. –

7

sendStickyBroadcast() esegue un sendBroadcast(Intent) noto come appiccicoso, vale a dire l'intento che si sta inviando soggiorni in giro dopo la trasmissione è stata completata, in modo che gli altri possano recuperare rapidamente i dati tramite il valore di ritorno di registerReceiver(BroadcastReceiver, IntentFilter). In tutti gli altri modi, questo si comporta come sendBroadcast(Intent). Un esempio di trasmissione appiccicosa inviata tramite il sistema operativo è ACTION_BATTERY_CHANGED. Quando chiami registerReceiver() per quell'azione - anche con un valore nullo BroadcastReceiver - ottieni l'intento che era l'ultima trasmissione per quell'azione. Quindi, è possibile utilizzare questo per trovare lo stato della batteria senza necessariamente registrarsi per tutti i futuri cambiamenti di stato nella batteria.

7

Il valore di una trasmissione appiccicosa è il valore trasmesso l'ultima volta ed è attualmente conservato nella cache persistente. Questo non è il valore di una trasmissione che è stata ricevuta in questo momento. Suppongo che tu possa dire che è come un cookie del browser a cui puoi accedere in qualsiasi momento.Il broadcast permanenti è ora sconsigliato:

Questo metodo è stata sconsigliata a livello di API 21. broadcast permanenti dovrebbero non possono essere utilizzati. Non forniscono alcuna sicurezza (chiunque può accedervi), nessuna protezione (chiunque può modificarli) e molti altri problemi. Il modello consigliato da consiste nell'utilizzare una trasmissione non appiccicosa per segnalare che è stato modificato qualcosa , con un altro meccanismo per le app per recuperare il valore corrente quando lo si desidera.

+1

Un collegamento al documento di riferimento sarebbe molto utile. –

+0

Non ricordo il documento di riferimento. Non sapevo che questa era una buona etichetta, ma ora capisco bene perché. Def copia e incollato questo da qualche parte. –

Problemi correlati