Qu'est-ce qu'une diffusion rémanente?

89

Je suis tombé sur ce terme dans la documentation Android avec la définition qui l'accompagne

Il s'agit de diffusions dont les données sont conservées par le système une fois terminées, afin que les clients puissent récupérer rapidement ces données sans avoir à attendre la prochaine diffusion.

Qu'est-ce que ça veut dire? Quelqu'un peut-il élaborer son utilisation avec un exemple particulier? Je pense que nous devons demander une autorisation pour utiliser cette intention? Pourquoi ça?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents.
Shouvik
la source
3
08 / février / 2019, pour tous ceux qui recherchent une émission collante et se sont terminés ici, du document officiel 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

Réponses:

110

Si une activité appelle onPauseavec une diffusion normale, la réception de la diffusion peut être manquée. Une diffusion persistante peut être vérifiée après son lancement onResume.

Mise à jour 23/06/2020

Les diffusions persistantes sont obsolètes.

Consultez la sendStickyBroadcastdocumentation .

Cette méthode était obsolète au niveau de l'API 21.

Les émissions rémanentes ne doivent pas être utilisées. Ils n'offrent aucune sécurité (n'importe qui peut y accéder), aucune protection (n'importe qui peut les modifier) ​​et bien d'autres problèmes. Le modèle recommandé est d'utiliser une diffusion non collante pour signaler que quelque chose a changé, avec un autre mécanisme permettant aux applications de récupérer la valeur actuelle à tout moment.

Mettre en place

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

Ressources

Paul Burke
la source
Salut, je suis en train de me confondre avec la diffusion persistante avec l'enregistrement statique de la diffusion. Je viens de lire quelque part que la différence entre l'enregistrement d'une diffusion dans le fichier manifeste et l'enregistrement par programme est uniquement que le plus éloigné ne désenregistre pas l'émission mais y reste, tandis que le dernier désenregistre la diffusion dans la méthode onPause ().
Shaista Naaz
Remarque: dans la plupart des cas, les émissions persistantes doivent être évitées. Voir le lien dans la réponse de @Nikhil_Katre pour plus d'informations
gMale
@Shaista: les récepteurs de manifestes fonctionnent même lorsque votre application est inactive alors qu'un récepteur programmatique ne répond que lorsque l'application dans laquelle il est enregistré est en cours d'exécution
gMale
@gmale Donc, si nous sommes en activité et que nous sommes dans onPause () et que nous avons appelé unregisterReceiver () .. Aurons-nous la diffusion lorsque nous reprendrons dans onResume ()
Kushal
1
@PaulBurke Je n'ai pas trouvé le nom Mark Murphy dans le lien ci-dessus. Ce lien me redirige vers la question et non sur la réponse exacte. Pouvez-vous s'il vous plaît mettre à jour l'URL ?.
Vishal Chhodwani
11

sendStickyBroadcast()exécute un sendBroadcast(Intent)dit sticky, c'est-à-dire que l'intention que vous envoyez reste une fois la diffusion terminée, afin que d'autres puissent récupérer rapidement ces données via la valeur de retour de registerReceiver(BroadcastReceiver, IntentFilter). De toutes les autres manières, cela se comporte de la même manière que sendBroadcast(Intent). Un exemple de diffusion persistante envoyée via le système d'exploitation est ACTION_BATTERY_CHANGED. Lorsque vous appelez registerReceiver()cette action, même avec une valeur nulle BroadcastReceiver, vous obtenez l'intention qui a été diffusée en dernier pour cette action. Par conséquent, vous pouvez l'utiliser pour trouver l'état de la batterie sans nécessairement vous enregistrer pour tous les futurs changements d'état de la batterie.

Narendra Motwani
la source
8

La valeur d'une diffusion persistante est la valeur qui a été diffusée la dernière fois et qui est actuellement conservée dans le cache permanent. Ce n'est pas la valeur d'une émission qui a été reçue en ce moment. Je suppose que vous pouvez dire que c'est comme un cookie de navigateur auquel vous pouvez accéder à tout moment. La diffusion persistante est désormais obsolète, selon la documentation relative aux méthodes de diffusion persistantes ( par exemple ):

Cette méthode était obsolète dans l'API niveau 21. Les diffusions persistantes ne doivent pas être utilisées. Ils n'offrent aucune sécurité (n'importe qui peut y accéder), aucune protection (n'importe qui peut les modifier) ​​et bien d'autres problèmes. Le modèle recommandé est d'utiliser une diffusion non collante pour signaler que quelque chose a changé, avec un autre mécanisme permettant aux applications de récupérer la valeur actuelle à tout moment.

Lou Morda
la source
3

Une intention de diffusion normale n'est plus disponible après son envoi et son traitement par le système. Si vous utilisez la méthode sendStickyBroadcast (Intent), l'intention est persistante, ce qui signifie que l'intention que vous envoyez reste une fois la diffusion terminée.

vous vous référez à mon blog: entrez la description du lien ici

Arul Pandian
la source
1
J'ai ajouté la divulgation requise de la paternité du blog vers lequel vous créez un lien. Vous devez le faire vous-même à partir de maintenant, sinon vos messages risquent d'être supprimés en tant que spam.
Andrew Barber