2010-11-09 3 views
1

J'ai un service exécutant un thread d'arrière-plan. Qu'est-ce que je voudrais faire est de montrer un AlertDialog initié à partir de mon fil de fond. Je sais que ce n'est pas la façon recommandée de notifier l'utilisateur et qu'il interrompt le flux de travail (car ils peuvent apparaître dans n'importe quelle application à tout moment ) mais c'est un moyen approprié pour mon cas d'utilisation.AlertDialog.show est silencieusement ignoré dans un service

Un gestionnaire enregistré avec le fil d'arrière-plan et affichant une notification Toast avec le gestionnaire fonctionne correctement. Mais après avoir basculé vers un AlertDialog rien ne se passe plus. Ma logique showDialog est ignorée silencieusement. Aucune fenêtre de dialogue n'apparaît, aucune entrée de journal. C'est un peu étrange car je m'attendrais à au moins une entrée de journal en disant que je fais quelque chose de mal ou quoi que ce soit.

Y a-t-il des limitations pour afficher un AlertDialog initié à partir d'un thread d'arrière-plan de service ? Certaines personnes semblent recommander une activité sur le thème de Dialog pour obtenir un comportement similaire.

Toute clarification ou aide pour le faire fonctionner est grandement appréciée!

Yves

Répondre

1

Il est possible d'ouvrir une boîte de dialogue à partir d'un fil d'arrière-plan. L'astuce est de commencer une activité qui ressemble à une boîte de dialogue:

<activity android:label="@string/app_name" android:name="YourDialog" android:theme="@android:style/Theme.Dialog"/> 

Ensuite, pour démarrer votre activité:

Intent dialog = new Intent(this, YourDialog.class); 
dialog.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(dialog); 

Notez que ceci est asyncrhonous et ne bloque pas. Si vous voulez traiter le résultat, vous devrez utiliser startService() et passer une activité personnalisée pour indiquer un résultat.

Emmanuel

+0

Cela semble faire l'affaire.Apparemment, il est également possible d'avoir une activité qui affiche un AlertDialog dans la méthode onCreate. Le seul problème est que nous devons commencer une nouvelle tâche ce qui signifie que nous avons une nouvelle pile d'activités et que nous terminons le dialogue avec DialogActivity. This.finish() ne retourne pas à ma dernière tâche. Y a-t-il une solution de contournement connue pour obtenir ce comportement? – Yves

+0

Quel est le problème avec mon approche? Lorsque vous quittez il ne reviendrait pas? – Emmanuel

+0

Votre approche est complètement correcte. Mon application regroupe le service et une activité de contrôleur pour le démarrer/l'arrêter. Par exemple, je démarre le service via l'activité du contrôleur, naviguez vers le navigateur, puis un AlertDialog apparaît. Jusqu'ici tout va bien. Maintenant, lors de la fermeture de la boîte de dialogue (DialogActivity.this.finish();) je m'attendrais à revenir au navigateur, mais l'activité du contrôleur apparaît à la place. La solution ici est de marquer l'activité dans le manifeste avec l'attribut android: taskAffinity = "" pour le rendre complètement indépendant de l'activité du contrôleur et pour obtenir ma propre pile vide. – Yves

1

Y at-il des limites pour montrer un AlertDialog lancé à partir d'un fil d'arrière-plan de service?

La limitation est: ce n'est pas possible, AFAIK. Vous devez afficher des boîtes de dialogue à partir du thread d'application principal, pas seulement un thread arbitraire sur lequel vous avez un Handler.

Certaines personnes semblent recommander une activité sur le thème des dialogues pour obtenir un comportement similaire.

Cela semblerait être la solution la plus probable, AFAICT.

+0

Mon gestionnaire est défini dans l'activité principale de la classe de service et obtient le message "create Dialog" du thread d'arrière-plan. Je pense que c'est le moyen de s'assurer que je suis sur le fil de l'application principale? – Yves

1

Une autre astuce est de rester avec le AlertDialog mais avec un type de fenêtre supplémentaire TYPE_SYSTEM_ALERT:

AlertDialog alertDialog = new AlertDialog.Builder(this) 
        .setTitle("Title") 
        .setMessage("Are you sure?") 
        .create(); 

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
alertDialog.show(); 

Mais ne pas oublier d'ajouter cette autorisation:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 
Questions connexes