Utilisation d’une intention de diffusion / récepteur de diffusion pour envoyer des messages d’un service à une activité

Je comprends donc (je pense) les intentions de diffusion et leur réception.

Alors maintenant, mon problème / ce que je ne peux pas résoudre est comment envoyer un message de la méthode onReceive d’un récepteur à une activité. Disons que j’ai un récepteur en tant que tel:

 public class ReceiveMessages extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Ssortingng action = intent.getAction(); if(action.equalsIgnoreCase(TheService.DOWNLOADED)){ // send message to activity } } } 

Comment pourrais-je envoyer un message à une activité?

Devrais-je instancier le récepteur dans l’activité à laquelle je veux envoyer des messages et le surveiller d’une manière ou d’une autre? Ou quoi? Je comprends le concept, mais pas vraiment l’application.

Toute aide serait absolument incroyable, merci.

À M

EDITED Corrigé des exemples de code pour enregistrer / désenregistrer le BroadcastReceiver et également supprimé la déclaration de manifeste.

Définissez ReceiveMessages tant que classe interne dans l’ Activity qui doit écouter les messages du Service .

Ensuite, déclarez les variables de classe telles que …

 ReceiveMessages myReceiver = null; Boolean myReceiverIsRegistered = false; 

Dans onCreate() utilisez myReceiver = new ReceiveMessages();

Puis dans onResume()

 if (!myReceiverIsRegistered) { registerReceiver(myReceiver, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE")); myReceiverIsRegistered = true; } 

… et à la onPause()

 if (myReceiverIsRegistered) { unregisterReceiver(myReceiver); myReceiverIsRegistered = false; } 

Dans le Service créer et diffuser l’ Intent

 Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE"); sendBroadcast(i); 

Et c’est à peu près tout. Rendez l’action unique à votre package / application, par exemple, com.mycompany... comme dans mon exemple. Cela permet d’éviter une situation où d’autres applications ou composants système peuvent tenter de le traiter.

Aucune offense, mais votre question est toujours sacrément vague. Donc, je vais décrire tout un tas de scénarios et espérer que l’un d’eux touche effectivement tous les problèmes que vous pensez avoir.

Scénario A: Seulement l’activité

Si vous avez seulement besoin de recevoir la diffusion lorsque vous avez une activité au premier plan, faites enregistrer l’activité BroadcastReceiver par registerReceiver() . Comme @MisterSquonk l’a indiqué, vous enregistrez le récepteur dans onResume() et vous le onPause() dans onPause() .

Scénario B: Activité Si au premier plan, sinon autre; Diffusion ordonnée

Si vous souhaitez que l’activité de premier plan gère la diffusion, mais que vous souhaitez que quelque chose se produise si cette activité n’est pas au premier plan (par exemple, générer une Notification ) et que la diffusion soit une diffusion ordonnée (par exemple, un SMS entrant), utiliserait toujours la solution de scénario A, mais avec un IntentFilter priorité plus IntentFilter (voir setPriority() ). De plus, vous devez enregistrer un BroadcastReceiver via un élément dans le manifeste, avec un priorité inférieure pour la même diffusion. Dans BroadcastReceiver l’activité, appelez abortBroadcast() pour consumr l’événement et l’empêcher d’atteindre votre BroadcastReceiver enregistré en manifeste.

Scénario C: Activité Si au premier plan, sinon Autre; Diffusion régulière

Si le scénario B convient à peu près, mais que la diffusion que vous écoutez n’est pas une diffusion ordonnée, vous devez commencer par le scénario B. Cependant, la diffusion des deux récepteurs dans vos filtres respectifs doit être une diffusion privée. chaîne d’action comme @MisterSquonk a suggéré. De plus, ayez un autre BroadcastReceiver enregistré dans le manifeste, dont le correspond à la diffusion réelle que vous écoutez. Ce récepteur appelle simplement sendOrderedBroadcast() pour envoyer la diffusion commandée que les autres récepteurs écoutent.

Scénario D: activité indépendamment du premier plan

Si une activité de votre part doit être connue au sujet de la diffusion, peu importe si elle est au premier plan ou non, vous devez repenser ce que vous entendez par là. Habituellement, cela signifie en réalité que la diffusion affecte d’une manière ou d’une autre votre modèle de données. Dans ce cas, vous ne devriez pas laisser les activités savoir, mais mettre à jour votre modèle de données et utiliser vos le changement de modèle de données “logique gère le rest.

Si, toutefois, vous êtes convaincu que cela ne fait pas partie de votre modèle de données, vous pouvez implémenter le scénario B ou le scénario C, ainsi que coller des informations dans un membre de données statique. Vos activités peuvent examiner ce membre de données statique dans onResume() pour récupérer les informations relatives à la diffusion lorsqu’elles reviennent au premier plan.

Si vous pensez “mais que se passe-t-il si mon processus est interrompu entre la diffusion et l’autre activité au premier plan?”, Votre diffusion met réellement à jour votre modèle de données, conformément au premier paragraphe de ce scénario.

Si vous pensez “mais je veux mettre à jour une activité qui fonctionne en arrière-plan”, l’activité en question est brisée. Les activités ne devraient jamais faire le travail en arrière-plan. Ce travail devrait être délégué à une forme de service, et il existe tout un ensemble de scénarios pour obtenir une diffusion vers le service.

Pour diffuser une intention:

 Intent intent = new Intent("com.yourcompany.testIntent"); intent.putExtra("value","test"); sendBroadcast(intent); 

Pour recevoir la même intention, utilisez:

 IntentFilter filter = new IntentFilter("com.yourcompany.testIntent"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Ssortingng value = intent.getExtras().getSsortingng("value"); } }; registerReceiver(receiver, filter); 

Peut-être pas pertinent au moment où la question est posée, mais il y a maintenant le LocalBroadcastManager dans le package de support Android.

Fonctionne à peu près de la même manière que les diffusions normales, mais tous les “bavardages” sont locaux à l’application dans laquelle il s’exécute.

Avantages:

  • Vous savez que les données que vous diffusez ne quitteront pas votre application, vous n’avez donc pas à vous soucier de la fuite de données privées.
  • Il n’est pas possible pour d’autres applications d’envoyer ces émissions à votre application. Vous n’avez donc pas à vous soucier des failles de sécurité qu’elles peuvent exploiter.
  • C’est plus efficace que d’envoyer une diffusion globale via le système.

Exemple:

 Intent i = new Intent("my.local.intent"); LocalBroadcastManager.getInstance(context).sendBroadcast(i); 

et recevoir

 receiver = new MyBroadcastReceiverToHandleLocalBroadcast(); IntentFilter i = new IntentFilter(); i.addAction("my.local.intent"); LocalBroadcastManager.getInstance(context).registerReceiver(receiver, i);