2010-08-16 12 views
73

me encontré con este término en la documentación androide con la definición de acompañamiento¿Qué es una emisión fija?

Estas son las emisiones cuyos datos se lleva a cabo por el sistema después de haber terminado, por lo que los clientes pueden recuperar rápidamente los datos sin tener que esperar a la próxima emisión.

¿Qué significa? ¿Puede alguien explicar su uso con un ejemplo particular? Creo que tenemos que solicitar un permiso para usar esta intención? ¿Porque?

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

Respuesta

96

Lea la explicación de la marca Murphy aquí: what is the difference between sendStickyBroadcast and sendBroadcast in Android

He aquí un ejemplo abstracto de cómo se podría utilizar una emisión persistente:

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

Si está escuchando para esta emisión en una actividad eso estaba congelado (en Pausa), podrías perder el evento real. Esto le permite verificar la transmisión después de que se disparó (en Repetición).

EDIT: Más sobre emisiones persistentes ...

También puedes ver removeStickyBroadcast(Intent), y el API de nivel 5 +, isInitialStickyBroadcast() para el uso en el receptor de onReceive.

Espero que ayude.

+0

Hola, me confunden las transmisiones fijas con el registro estático de la transmisión. Acabo de leer en alguna parte que la diferencia entre registrar una transmisión en el archivo de manifiesto y registrarla programáticamente es solo que la más reciente no anula el registro de la emisión sino que permanece allí, mientras que la última anula la difusión en el método onPause(). –

+0

Nota: en la mayoría de los casos, las emisiones fijas deben evitarse. Consulte [el enlace en la respuesta de @Nikhil_Katre] (http://groups.google.com/group/android-developers/browse_thread/thread/f37e3549a5e1be66?pli=1) para obtener más información – gMale

+0

@Shaista: los receptores de manifiestos funcionan incluso cuando su aplicación está inactiva, mientras que un receptor programático solo responde cuando la aplicación en la que está registrado se está ejecutando – gMale

20

Tenga en cuenta que las emisiones fijas son pesadas en el sistema y no se recomiendan. Lea la nota de hackbod en la discusión en 'Sticky Broadcasts and Concurrency Options' en el grupo de Desarrolladores de Android.

@Shouvik, especifique el escenario exacto en el que piensa utilizar StickyBroadcasts. Alguien puede sugerir una solución alternativa.

+0

+1 para señalar las desventajas de las emisiones fijas, sin mencionar que si la aplicación falla (sí, esto podría suceder incluso si envolvió todo con try/catch y registró un 'Thread.setDefaultUncaughtExceptionHandler() '), estás atascado con algo que tienes que manejar con cuidado en la próxima invocación. En resumen, al igual que SharedPreferences y ContentProvider, podría ser engorroso y complicado. – ateiob

+0

¿Por "pesado en el sistema" te refieres a que podría ralentizarlo? ¿Cuándo está presente esta ralentización? Durante la aplicación, o incluso sin ejecutarlo? Las aplicaciones de Adobe AIR deben solicitar este permiso, por lo que es algo que no se puede evitar si se programa una aplicación de AIR, me temo. O solicite esto en su aplicación si tiene integrado el tiempo de ejecución de AIR en su aplicación o si hace que el usuario instale el tiempo de ejecución de Adobe AIR, que solicita este permiso. – OMA

+0

He aquí un escenario que intento lograr y me pregunto si las difusiones persistentes podrían lograrlo. Necesito mantener el estado de un servicio en memoria, incluso si el servicio se cancela, y sin tocar ningún recurso externo como flash. Puedo hacer esto sin adherencia, pero me encuentro con problemas de concurrencia actualizando el estado si los intentos se entregan de manera consecutiva. – Michael

1

Una transmisión normal La intención ya no está disponible después de que el sistema la envió y procesó. Si usa el método sendStickyBroadcast (Intención), la intención es adhesiva, lo que significa que la intención que está enviando se mantiene después de que se complete la transmisión.

que se refieren a mi blog: enter link description here

+1

He agregado la divulgación requerida de su autoría del blog al que está enlazando. * Debe * hacer esto usted mismo a partir de ahora, o sus publicaciones están sujetas a ser eliminadas como correo no deseado. –

7

sendStickyBroadcast() realiza una sendBroadcast(Intent) conocido como pegajosa, es decir, la intención que está enviando estancias alrededor después de la emisión se ha completado, por lo que los demás puedan recuperar rápidamente los datos a través del valor de retorno de registerReceiver(BroadcastReceiver, IntentFilter). En todos los demás aspectos, esto se comporta de la misma manera que sendBroadcast(Intent). Un ejemplo de una transmisión fija enviada a través del sistema operativo es ACTION_BATTERY_CHANGED. Cuando llama al registerReceiver() para esa acción, incluso con un nulo BroadcastReceiver, obtiene la intención que se transmitió por última vez para esa acción. Por lo tanto, puede usar esto para encontrar el estado de la batería sin registrarse necesariamente para todos los cambios de estado futuros en la batería.

7

El valor de una emisión fija es el valor que se transmitió por última vez y que actualmente se guarda en la memoria caché. Este no es el valor de una transmisión que se recibió en este momento. Supongo que puede decir que es como una cookie del navegador a la que puede acceder en cualquier momento.La emisión adhesiva ahora está en desuso:

Este método está en desuso en el nivel de API 21. No se deben usar transmisiones fijas . No proporcionan seguridad (cualquiera puede acceder a ellos), no hay protección (cualquiera puede modificarlos) y muchos otros problemas. El patrón recomendado es utilizar una difusión no adhesiva para informar que algo ha cambiado, con otro mecanismo para que las aplicaciones recuperen el valor actual siempre que lo desee.

+1

Un enlace al documento al que se hace referencia sería muy útil. –

+0

No recuerdo el documento al que se hace referencia. No sabía que esta era una etiqueta SO tan pobre, pero ahora puedo ver claramente por qué. Def copie y pegue esto desde alguna parte. –