Tostadas creadas en un IntentService nunca desaparecen

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

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

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

¿Qué estoy haciendo mal?

No debe crear Toast s de un Service . Debe utilizar una Notification lugar.

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

El siguiente código debe 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 la nueva intención y terminará inmediatamente una vez que la tarea haya terminado. Por lo tanto, el brindis estará fuera de control por un hilo muerto.

Debería ver algunas excepciones en la consola cuando aparezca el brindis 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.

Sólo necesitas una referencia de la actividad actual, y llámala con este código de ejemplo:

 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, compruebe esta pregunta: ¿Cómo obtener el actual contexto de la actividad en primer plano en android?

Pero yo 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); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.