2017-01-15 1 views
0

Ce problème est un peu différent de la plupart des problèmes de 'toast d'affichage'. Je ne demande pas d'afficher des messages Toast dans d'autres activités mais de voir les messages Toast envoyés par un service d'arrière-plan tandis que dans une autre activité en plus de l'activité principale. Je vois les messages Toast dans l'activité principale!Le message Toast provenant de l'arrière-plan s'affiche uniquement dans l'activité principale; pas d'autres activités

J'ai une application qui a un service d'arrière-plan. Lorsque certains événements se produisent dans ce service d'arrière-plan, un message Toast est affiché. Le service d'arrière-plan reçoit des données de périphériques externes BT et BLE et envoie des messages via le réseau Wi-Fi. Les messages toast montrent certains événements importants dans ces processus. Le MainActivity et le service d'arrière-plan utilisent le contexte d'application getApplicationContext() pour l'affichage de ce message toast.

Cependant, ces messages ne s'affichent pas si je passe à un autre Activity. Par exemple, pour configurer certains paramètres. Je n'essaie pas d'afficher des messages toast d'autres activités; que je peux faire. Mais comment puis-je obtenir les messages toast du service d'arrière-plan pour afficher également pendant que je suis dans un autre Activity en plus du MainActivity? Je pense que je devrai faire quelque chose comme 'lancer l'activité sur le contexte de l'application' bien que je n'ai aucune idée de la façon de le faire (ou même si c'est possible).

+2

s'il vous plaît fournir votre code –

Répondre

1

Utilisez BroadcastReceiver à cette fin. Dans chacun de vos Activity vous devez déclarer un BroadcastReceiver comme ceci.

private class ShowToastBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String message = intent.getStringExtra("Message"); 
     Toast.makeText(OtherActivity.this, message, Toast.LENGTH_LONG).show(); 
    } 
} 

Vous devez enregistrer le BroadcastReceiver chaque fois dans votre onResume et désenregistrer retour en fonction de vos activités.

// This is in your Activity 

private ShowToastBroadcastReceiver showToastBroadcastReceiver; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    showToastBroadcastReceiver = new ShowToastBroadcastReceiver(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    LocalBroadcastManager.getInstance(this).registerReceiver(showToastBroadcastReceiver, new IntentFilter("SHOW_TOAST")); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(showToastBroadcastReceiver); 
} 

Maintenant, vous devez envoyer la diffusion de votre Service pour obtenir le toast à afficher dans votre Activity.

// This is in your Service 

Intent intent = new Intent("SHOW_TOAST"); 
intent.putExtra("Message", "This toast needs to be shown"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
+0

Reaz, je n'ai aucun problème à envoyer des messages Toast de mon service.Je les vois bien mais seulement dans mon activité principale (j'utilise un récepteur de diffusion dans un cas et un gestionnaire dans un autre). Ce n'est pas le problème. C'est quand je passe à une autre activité, disons pour regarder la sortie de débogage, que je ne vois plus ces messages alors que le service continue de fonctionner et que les messages Toast continuent d'être envoyés. Je sais que c'est le cas parce qu'il continue à fonctionner avec des périphériques externes. –

+0

Avez-vous essayé d'envoyer des émissions? Avez-vous enregistré la diffusion dans toutes les autres activités? –

+0

Vous avez trouvé la réponse pour moi parce que j'ai fait quelque chose de vraiment stupide. Pas dans l'enregistrement du récepteur de diffusion mais dans son désenregistrement. J'avais ce dernier à un niveau trop élevé. Je devais le mettre dans onDestroy et non sur onStop(). Quel idiot j'étais! –

0

Vous devriez être en mesure d'afficher un Toast de tout contexte, y compris un Service. Le guide du développeur Toast Notifications a un exemple de code qui montre comment:

Context context = getApplicationContext(); 
CharSequence text = "Hello toast!"; 
int duration = Toast.LENGTH_SHORT; 

Toast toast = Toast.makeText(context, text, duration); 
toast.show(); 

En d'autres termes, vous n'avez pas besoin Activity du tout. Vous pouvez afficher le Toast directement à partir du Service. Si vous êtes inquiet de le faire à partir d'un thread séparé, créez un Handler dans le thread principal du Service et publiez un Runnable ou un message à ce gestionnaire pour afficher le Toast. Une autre possibilité est que vous utilisez un service lié et qu'il disparaît lorsque vous quittez l'activité principale. Assurez-vous que le service est toujours en cours d'exécution.

Oh, et assurez-vous également que le paramètre 'Afficher les notifications' pour votre application n'a pas été décoché.

+0

Merci Ted mais ce n'est pas le problème. J'affiche des messages Toast à partir d'un service en arrière-plan qui ne disparaît jamais en utilisant un récepteur de diffusion et dans un autre cas un gestionnaire. Je sais que le service ne va pas disparaître car il échange avec succès des données avec un périphérique externe. Mais je ne vois ces messages Toast que dans mon activité principale. Si je devais passer de mon activité principale à une autre activité, par exemple pour configurer certains paramètres ou regarder une sortie de débogage, je ne vois plus ces messages Toast quand ils sont envoyés. –

0

Grâce à Reaz, j'ai trouvé une erreur stupide que j'avais faite. Je désinscrimais le BroadcastReceiver gérant les toasts à onStop() au lieu de onDestroy(). Déplacer l'annulation d'enregistrement sur onDestroy() et l'enregistrement et les filtres à onCreate() a résolu le problème.