Aller au contenu

Toast dans un broadcastReceiver sur n'importe quelle activité


Frack94

Recommended Posts

Bonjour,

Je voudrais pouvoir afficher un toast "Le contact a été créé avec succès" sur n'importe quelle activité une fois l'intentService de création d'un contact terminé.

J'utilise pour cela un broadcastReceiver qui affiche un toast:

@Override
public void onReceive(Context context, Intent intent)
{
 AjoutContactService.OPERATION_RESULT result = (OPERATION_RESULT) intent.getExtras().get(
AjoutContactService.PARAM_OUT_MSG);
 switch (result)
 {
  case OK:
Toast.makeText(context, "Le contact a ete cree;", Toast.LENGTH_SHORT).show();
break;
  case KO:
Toast.makeText(context, "Le contact n'a pas pu etre cree;", Toast.LENGTH_SHORT).show();
break;
 }
}

Ce broadcastReceiver est enregistré dans mon activité "liste de contacts" et donc le toast s'affiche bien si après avoir lancé le service, je retourne à liste de contacts:

Intent msgIntent = new Intent(this, AjoutContactService.class);
 Contact contactToCreate = new Contact(prenom, prenom, age, email, tel, address);
 msgIntent.putExtra(IhmUtils.CONTACT, contactToCreate);
 Toast.makeText(this, "creation du contact...", Toast.LENGTH_LONG).show();
 startService(msgIntent);
 startActivity(new Intent(this, MyContactsActivity.class));

Mais si avant la fin de création du contact, je consulte un autre contact, le toast n'apparaitra jamais...

Ma question est-donc: faut-il enregistrer le broadcastReceiver dans toutes les activités où je souhaite afficher le toast?

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, si tu veux que le Toast s'affiche quelle que soit l'Activity affichée, il faudrait que tu associes un BroadcastReceiver à chaque Activity. Une autre solution serait plutôt de gérer un BroadcastReceiver au niveau du Service, voire même te passer de BroadcastReceiver, et faire afficher le Toast par le Service lui-même lorsque la création du contact est faite (sous réserve de gérer la synchro entre threads, je suppose que la création d'un contact est faite de manière asynchrone, genre avec un AsyncTask ?)

Lien vers le commentaire
Partager sur d’autres sites

Merci de ta réponse.

La création d'un contact est faite par un intentService (AjoutContactService dans le 1er extrait de code); j'ai lu un peu partout que c'était une meilleure solution qu'un AsyncTask pour les traitements en tâche de fond.

@Override
protected void onHandleIntent(Intent intent) {
.......
if (mgr.addContact(c) >= 0)
  {

broadcastIntent.putExtra(PARAM_OUT_MSG, OPERATION_RESULT.OK);
  }
  else
  {
broadcastIntent.putExtra(PARAM_OUT_MSG, OPERATION_RESULT.KO);
  }
  sendBroadcast(broadcastIntent);

Comme un Service n'a pas de context, impossible d'afficher un toast dans la méthode onHandleIntent, d'où le besoin de passer par un sendBroadcast depuis le service pour gérer la mise à jour de l'interface (affichage du toast).

J'implémenterai un AsyncTask pour la suppression en mode batch de mes contacts. Je crois que c'est la solution la plus adaptée pour mettre à jour régulièrement l'interface via un progressDialog par exemple non? Ou alors je fais un sendBroadcast à chaque fois qu'un contact est supprimé, ce qui permettrait de mettre à jour un progressDialog en variable de class d'un broadcastReceiver

J'ai lu que l'inconvénient d'un AsyncTask c'est qu'elle est liée à l'activité et donc qu'une rotation ou un destroy tuerait l''asyncTask aussi

Lien vers le commentaire
Partager sur d’autres sites

Un Service est un Context, donc tu devrais pouvoir afficher un Toast depuis un Service (mais à vérifier dans le cas d'un IntentService, qui utilise un thread séparé pour le traitement via onHandleEvent)

Une AsyncTask est effectivement en général liée à une Activity, soit explicitement, soit implicitement, mais cette AsyncTask n'est pas détruite automatiquement lors de la rotation ou le destroy d'une Activity. Mais elle se retrouve dans ce cas-là avec une référence sur une Activity qui n'existe pas, et ça se traduit souvent au final par un plantage, à moins de gérer soi-même cela, ce qui complexifie le code

Il vaut mieux passer par un Service/IntentService si ton IHM peut disparaître alors que le traitement n'est pas terminé

Lien vers le commentaire
Partager sur d’autres sites

Finalement je suis resté sur le couple IntentService - BroadCastReceiver pour la suppression en mode batch.

C'est apparemment préféré aux AsyncTask qui sont eux même préférés aux Threads et ce n'est pas beaucoup plus compliqué à mettre en oeuvre.

Effectivement un IntentService est un context donc un toast devrait fonctionner. Je testerai ça demain, ça devrait aller vite.

Merci!

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...