Comment afficher Toast à partir d'un service après la fin de l'activité principale?
Mise à JOUR: je ne suis pas d'accord que c'est un double - parce que je suis à la recherche d'un moyen de sortir de l'application principale et montrent encore un Toast à partir du service.
Dans une épreuve très simple d'application j'ai 2 boutons:
Cliquant sur un des boutons pour exécuter un service avec un correspondant de la chaîne d'action ("ouvrir" ou "flash") -
public class OpenActivity extends Activity {
private Intent mServiceIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_open);
mServiceIntent = new Intent(this, RegionService.class);
}
public void openCar(View v) {
mServiceIntent.setAction("open");
startService(mServiceIntent);
}
public class RegionService extends IntentService {
private static final String TAG = "RegionService";
@Override
protected void onHandleIntent(Intent intent) {
Log.d(TAG, "Received an intent: " + intent);
String action = intent.getAction();
Log.d(TAG, "Received an action: " + action);
if(action.equals("open")) {
Toast.makeText(this,
getString(R.string.car_opened),
Toast.LENGTH_SHORT).show();
}
Malheureusement, mon application se bloque avec:
D/RegionService(24506): Received an intent: Intent { act=open cmp=de.afarber.mynotification/.RegionService }
D/RegionService(24506): Received an action: open
W/MessageQueue(24506): Handler (android.os.Handler) {422768a8} sending message to a Handler on a dead thread
W/MessageQueue(24506): java.lang.RuntimeException: Handler (android.os.Handler) {422768a8} sending message to a Handler on a dead thread
W/MessageQueue(24506): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:320)
W/MessageQueue(24506): at android.os.Handler.enqueueMessage(Handler.java:626)
W/MessageQueue(24506): at android.os.Handler.sendMessageAtTime(Handler.java:595)
W/MessageQueue(24506): at android.os.Handler.sendMessageDelayed(Handler.java:566)
W/MessageQueue(24506): at android.os.Handler.post(Handler.java:326)
W/MessageQueue(24506): at android.widget.Toast$TN.hide(Toast.java:370)
W/MessageQueue(24506): at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:54)
W/MessageQueue(24506): at android.os.Binder.execTransact(Binder.java:412)
W/MessageQueue(24506): at dalvik.system.NativeStart.run(Native Method)
Étant une programmation Android newbie, je me demande Comment afficher une Toast de Service dans une manière correcte?
Je pense que je l'ai déjà vu sur des Toasts à l'Android à la Maison (c'est à dire il n'y a pas eu d'Activité sur l'écran de l'appareil et il y avait encore des Toasts).
Mon contexte: je tiens à surveiller un phare de l'appareil de mon service et de montrer quelques-texte Toasts - même lors de mon application a été fermée.
source d'informationauteur Alexander Farber
Vous devez vous connecter pour publier un commentaire.
OnHandleIntent
sera exécuté dans un differantThread
donc, vous êtes en montrant
Toast
dans un thread qui n'est pas autorisé dans androidafin de modifier votre code comme ceci
De cette morts thread en service
IntentService permettra de créer un thread pour gérer la nouvelle intention, et résilié immédiatement une fois que la tâche a fait. Ainsi, le pain va être contrôlée par un morts fil.
Vous devriez voir quelques exceptions dans la console lorsque le toast de l'affichage sur l'écran.
Tout ce qui se passe dans le thread d'arrière-plan et non pas sur le thread de l'INTERFACE utilisateur, de sorte que vous besoin d'une autre façon, comme indiqué ci-dessous:
Source: Toast créé dans une IntentService ne va jamais loin
OnHandleIntent
est appelée sur un thread d'arrière-plan, et toute tentative de toucher à l'INTERFACE utilisateur va entraîner une panne. Utiliser un Gestionnaire de poster un Exécutable sur le Thread d'INTERFACE utilisateur pour afficher votre toast.utiliser le code suivant:
Ce problème parce que de ne pas courir le Toast de la main_thread, et à surmonter que,
lors de la création de l'Activité de l'enregistrer contexte de
onCreate()
méthode:puis, dans le service, ajouter un gestionnaire et d'exécution d'un thread(comme Gestionnaire, est exécutée par le Thread principal):