FLAG_ACTIVITY_REORDER_TO_TOP haciendo que RuntimeException o la pantalla negra en rotación

Tengo dos actividades y quiero cambiar entre ellas sin volver a crearlas ni duplicarlas. Cada actividad tiene un botón que enviará al usuario al otro utilizando una intención con FLAG_ACTIVITY_REORDER_TO_TOP.

Esto funciona muy bien excepto por la siguiente condición:

  1. Iniciar la aplicación después de una fuerza de cierre
  2. Pulsa el botón para ir a la actividad 2
  3. Pulse el botón para volver a la actividad 1
  4. Girar la pantalla.

En este punto, la aplicación se bloquea con "Realizar detención de actividad que no se reanuda". Lollipop sólo muestra una pantalla en negro.

Extrañamente, si vas a la pantalla de inicio antes del paso 4 y reanudar la aplicación y luego girar la condición anterior no tiene ningún problema y la aplicación funciona bien hasta que se cierra / reiniciado.

Esta condición parece específica de FLAG_ACTIVITY_REORDER_TO_TOP y sucede en Android 5.0 y 4.4 y sólo en un nuevo comienzo.

No tengo atributos en las actividades del manifiesto. Los diseños sólo tienen un botón que llama a un método que se parece a esto:

MainActivity: public void goSecond(View v) { Intent i = new Intent(this, SecondActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(i); } SecondActivity: public void goFirst(View v) { Intent i = new Intent(this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(i); } 

No estoy anulando ningún otro método del ciclo de vida o haciendo cualquier otra cosa.

¿Algunas ideas?

Caso interesante, si depura los métodos de ciclo de vida se puede ver que, como girar la pantalla, onStop se está llamando, sin onPause antes. El accidente luego registra

 java.lang.RuntimeException: Performing pause of activity that is not resumed: MainActivity 

seguido por

 java.lang.RuntimeException: Performing stop of activity that is not resumed: MainActivity 

Supongo que es un error en el marco. Curiosamente, esto sólo parece ocurrir con el flag FLAG_ACTIVITY_REORDER_TO_FRONT .

Como de la escritura que acabo de encontrar este post, lo que demuestra claramente que parece ser una falla importante con este indicador: ¿Es una alternativa de Intent.FLAG_ACTIVITY_REORDER_TO_FRONT (observe el mencionado boleto de errores de Android)


Solución: Si FLAG_ACTIVITY_REORDER_TO_FRONT del comportamiento que FLAG_ACTIVITY_REORDER_TO_FRONT te da y quieres imitar (tipo de), puedes usar

 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

En su lugar (sin embargo, funciona de forma ligeramente diferente: borra la pila encima de la actividad llamada, en lugar de reordenarla, por lo que tendría al menos 1 recreación de actividad).

Otra opción es jugar con el atributo launchMode en la definición de la actividad en el manifiesto. launchMode="singleInstance" podría ser lo que buscas (sin embargo esto se ensucia con tu pila de tareas, así que maneja con precaución)

Después de todo, si su diseño lo permite, considere fragmentos para evitar esos problemas por completo.

  • ¿Cómo puedo pasar URI con intención explícita?
  • Abra la cámara usando la intención
  • Iniciar y detener la grabación desde un botón en una notificación
  • Apertura del cliente de correo electrónico a través de Intent (pero no para enviar un mensaje)
  • Transmisión de datos a través de la intención utilizando Serializable
  • Intención: quitar botones Siempre / Sólo una vez
  • Android SMS Intent Hangouts 2.0
  • Intent.getExtras () devuelve siempre null
  • Intención de actividad en Side-Menu.Android de diseño de material
  • Listando todos los extras de una Intención
  • Integración de la aplicación con los resultados de búsqueda de Google y Chrome
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.