¿Por qué iniciar una actividad desde un widget causa que mi actividad principal comience también?

Cuando inicio una actividad desde un widget, quiero que el botón de retroceso vaya a la pantalla principal, pero en su lugar va a la actividad principal de la aplicación. Después de juguetear alrededor encontré que si de alguna manera cierra la actividad principal de la aplicación, este problema no ocurre. Extraño.

Encontré una solución aquí que decía llamar finish (); En la onPause de mi actividad principal (). Obviamente esta es la solución equivocada, por ejemplo, la reorientación de la pantalla provoca una onPause () para que la actividad de voluntad muera cada vez que el teléfono se gira.

Así es como empiezo mi actividad:

@Override public void onReceive(Context context, Intent intent) { [...] //new Emergency().emDialog(context).show(); Intent myIntent = new Intent(context, EmergencyActivity.class); // FLAG_ACTIVITY_NEW_TASK is needed because we're not in an activity // already, without it we crash. myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); 

Puedes ver el resto del código en http://code.google.com/p/emergencybutton/source/browse

Editar: He intentado funcionar la actividad diferentemente, pero todavía no trabaja correctamente:

 Intent myIntent = new Intent(); myIntent.setClassName("com.emergency.button", "com.emergency.button.EmergencyActivity"); 

Aunque nunca he utilizado widgets, creo que al hacer clic en el widget está reanudando una tarea existente. Por lo tanto, cuando usted está en esa tarea, volverá a la última actividad en esa tarea (en lugar de Inicio).

Vea este enlace y elija el modo de lanzamiento adecuado para su widget http://developer.android.com/guide/topics/fundamentals.html#lmodes

Ok, así que no estoy exactamente seguro de lo que pasó aquí pero android:launchMode="singleInstance" en la actividad en AndroidManifest.xml lo arregló de alguna manera.

  <activity android:name=".EmergencyActivity" android:launchMode="singleInstance" 

@Octavian – Debería haber aclarado que iniciar la actividad de un onReceive en un AppWidgetProvider. Estoy en la pantalla de inicio, iniciando una actividad titulada B, pero de alguna manera tanto A como B están en la pila de actividades en lugar de sólo B.

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

El comportamiento no es extraño, es sólo la forma en que funciona Android. La pila de actividades sólo realiza un seguimiento de todas las actividades. Ahora, cuando inicia una actividad A que inicia otra actividad B, entonces su pila parece (B, A). Si presiona la tecla de retroceso, la actividad B se va a extraer de la pila y A se va a llevar de nuevo al primer plano.

La solución correcta es simplemente llamar a finish() justo después de disparar el Intent .

A veces no es posible usar launchMode singleInstance en la aplicación por algunas razones. En este caso, debe iniciar su actividad y borrar la pila de actividades. Puede archivar esto usando banderas. Hay un ejemplo:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
  • Cambiar la orientación de la orientación con AsyncTask
  • Obtener actividad de llamada de alguna otra actividad
  • Android: Restaurar la actividad activa mientras se reanuda la aplicación
  • TaskStackBuilder en PendingIntent no funciona
  • Inicio automático de una nueva actividad en android
  • ¿Cómo saber cuándo una actividad finaliza un pase de diseño?
  • ¿Cómo cancelar un diálogo temático como Actividad cuando se toca fuera de la ventana?
  • Cómo hacer que un método View invisible / Gone onBackPressed () en android
  • ¿Importa en qué orden llamo finish () y startActivity ()?
  • ¿Cómo crear un servicio de fondo siempre en ejecución?
  • ¿Cómo obtener una lista de la pila de historial de actividades?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.