¿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); 
  • Inicio dinámico de la actividad con DexClassLoader
  • Cómo hacer una actividad de fondo transparente y difuminar el fondo
  • ¿La mejor manera de agregar actividad a un proyecto de Android en Eclipse?
  • El servicio se detiene cuando la actividad está cerrada
  • Android: Cómo ampliar mi clase de actividad con RoboActivity + ActionBarActivity
  • ¿Debo declarar cada actividad en un archivo de manifiesto?
  • Cómo ejecutar la actividad en segundo plano en Android
  • Evite la actividad de la pantalla de bienvenida al presionar el botón Atrás
  • Actividad transparente se está abriendo sobre la actividad principal. ¿Cómo abrirlo no sobre la actividad principal?
  • Ejemplo: Comunicación entre actividad y servicio mediante mensajería
  • Mi actividad no se muestra en el uso de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.