Toast creado en un IntentService nunca desaparece

Tengo un IntentService que descarga algunos archivos. El problema es que creo un Toast dentro de IntentService como este

Toast.makeText(getApplicationContext(), "some message", Toast.LENGTH_SHORT).show(); 

El Toast nunca desaparecerá si salgo de la aplicación. La única forma de destruirlo es matar el proceso.

¿Qué estoy haciendo mal?

No debe crear Toast de un Service . Deberías usar una Notification lugar.

El problema es que IntentService no se está ejecutando en el subproceso principal de la aplicación. necesita obtener un Handler para el hilo principal (en onCreate() ) y publicar el Toast como Runnable .

el siguiente código debería hacer el truco:

 @Override public void onCreate() { super.onCreate(); mHandler = new Handler(); } @Override protected void onHandleIntent(Intent intent) { mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(MyIntentService.this, "Hello Toast!", Toast.LENGTH_LONG).show(); } }); } 

Esto funciona para mí:

 public void ShowToastInIntentService(final String sText) { final Context MyContext = this; new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast toast1 = Toast.makeText(MyContext, sText, Toast.LENGTH_LONG); toast1.show(); } }); }; 

IntentService creará un hilo para manejar el nuevo bash, y lo terminará inmediatamente una vez que la tarea haya terminado. Entonces, el Toast estará fuera de control por un hilo muerto.

Debería ver algunas excepciones en la consola cuando se muestran las tostadas en la pantalla.

Para las personas que se desarrollan en el estudio Xamarin, así es como se hace allí:

 Handler handler = new Handler (); handler.Post (() => { Toast.MakeText (_Context, "Your text here.", ToastLength.Short).Show (); }); 

Para mostrar un brindis cuando el usuario está en una de las actividades de la aplicación.

Solo necesita una referencia de la actividad actual y llamarlo con este código de muestra:

 public void showToast(final String msg) { final Activity a = currentActivity; if (a != null ) { a.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(a, msg, Toast.LENGTH_SHORT).show(); } }); } } 

Hay muchas opciones para obtener la actividad actual, consulte esta pregunta: ¿Cómo obtener el contexto actual de la actividad de primer plano en Android?

Pero uso este enfoque:

La aplicación debe tener:

 private Activity currentActivity = null; public Activity getCurrentActivity() { return currentActivity; } public void setCurrentActivity(Activity mCurrentActivity) { this.currentActivity = mCurrentActivity; } 

Cada actividad debe tener:

 @Override protected void onResume() { super.onResume(); ((MyApplication) getApplication()).setCurrentActivity(this); } @Override protected void onPause() { super.onPause(); ((MyApplication) getApplication()).setCurrentActivity(null); }