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:
- Cierre actividad de otra actividad a través de una intención
- Compruebe si hay un BroadCastReceiver registrado con una cadena de acción
- Comprobar si la aplicación está instalada - Android
- OnActivityResult obtener RESULT_CANCELLED cuando se utiliza Intent.EXTRA_ALLOW_MULTIPLE
- BroadcastReceiver para ACTION_MEDIA_BUTTON no funciona
- Iniciar la aplicación después de una fuerza de cierre
- Pulsa el botón para ir a la actividad 2
- Pulse el botón para volver a la actividad 1
- 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?
- La intención implícita no se llama en android
- ¿Android comprueba si la aplicación alcanzó fondo cuando el usuario presionó el botón casero?
- Los extras de intención no se han quitado / reemplazado
- Abre la actividad de correo electrónico y obtén resultados?
- ¿Podemos usar Intent.EXTRA_ALLOW_MULTIPLE para versiones anteriores de los niveles de la API de Android usando la Biblioteca de soporte de Android?
- ¿Por qué a la gente le gusta asociar CLEAR_TOP y SINGLE_TOP en android
- ¿Cómo obtengo datos adicionales de intenciones en Android?
- Android 4.1+: ¿Cambia el número antes de que se registre en el registro de llamadas?
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.
- ¿Por qué utilizar putFloat (clave de cadena, valor de flotante), putInt (clave de cadena, valor de int) en lugar de sobrecarga poner (…)
- No hay certificado de pares Excepción – Volley y Android con certificado auto-firmado