cómo evitar el crecimiento de la pila de actividad en Android

Leí en alguna parte que cada vez que llamas a startActivity() para hacer la transición a una nueva pantalla, estás creando una nueva instancia de esa actividad. Esto inmediatamente me levantó una bandera roja.

En busca de una forma de evitar este problema, leí sobre el uso de FLAG_ACTIVITY_REORDER_TO_FRONT. Sin embargo, estoy un poco alarmado de que este método no se use en ninguno de los tutoriales que he visto para abrir una nueva pantalla en su aplicación. Así que creo que me podría estar perdiendo algo. Quiero decir, ¿no querrías siempre asegurarte de no crear una actividad duplicada? ¿No es esto un gran problema y no deberían los tutoriales abordarlo?

Solo quiero asegurarme de que estoy entendiendo y tratando este problema correctamente y usando la forma comúnmente practicada para la transición entre pantallas.

Entiendo que en algunos casos abres una pantalla, haces algo, luego la cierras usando finish() y regresas. Pero si una aplicación tiene una jerarquía compleja de 4 niveles y el usuario necesita poder saltar entre las pantallas.

preguntado el 15 de mayo de 13 a las 04:05

3 Respuestas

Quiero decir, ¿no querrías siempre asegurarte de no crear una actividad duplicada?

La mayoría de las veces probablemente no querrá tener dos instancias del mismo Activity pero supongo que hay situaciones en las que alguien podría

¿No es un gran problema y los tutoriales no deberían abordarlo?

Definitivamente es algo que los desarrolladores de Android deben conocer y entender cómo usarlo. Me imagino que es posible que no vea mucho en los tutoriales porque la mayoría de ellos le enseñan los conceptos básicos para comenzar. Cuando un desarrollador es nuevo en Android, normalmente tiene suficiente para aprender sobre el marco. Y normalmente le muestran cómo hacer algunas pantallas (que a menudo es todo lo que alguien puede necesitar). Esperan que aprenda más detalles leyendo los documentos y usando sitios web como SO

Entiendo que en algunos casos abres una pantalla, haces algo, luego la cierras usando finish() y regresas. Pero si una aplicación tiene una jerarquía compleja de 4 niveles y el usuario necesita poder saltar entre las pantallas.

Sí, muchas veces no profundizarás demasiado porque cuanto más profundo, más fácil es sentirte "perdido". Por eso me gusta usar Activities con un Dialog Theme cuando sea posible. Da la sensación de que en realidad no estás saliendo de la pantalla en la que estás. Sin embargo, eso realmente no responde a tu pregunta. Hay muchas banderas que se pueden usar con Intents para evitar que la pila crezca. El que mencionas funciona y yo también lo uso Intent.FLAG_ACTIVITY_CLEAR_Top bastante a menudo si necesito borrar todo Activities de la pila y volver a uno solo Activity. Puede haber tantas situaciones diferentes entre aplicaciones, usuarios y desarrolladores que la forma en que realiza la transición y trabaja el flujo o la navegación solo depende de lo que usted (realmente, el usuario) necesita.

Parece que estás en el camino correcto al hacer estas preguntas. Piense en lo que le dará al usuario la mejor y más natural experiencia y encuentre las banderas correctas en el Documentos de intenciones por tu situación

Espero que esto te haya aclarado un poco las cosas. Si no entiendes algo, no dudes en preguntar

contestado el 15 de mayo de 13 a las 04:05

Por lo general, desea evitar crear una actividad duplicada y, en mi humilde opinión, es un error en el sistema Android que el comportamiento predeterminado es permitirlo.

(A veces desea permitirlo, por ejemplo, ha escrito una actividad "obtener nombre de archivo" y es probable que más de una aplicación lo llame).

Usted controla la creación de actividad en dos lugares: en el manifiesto y en las banderas de la intención que lo inicia.

En el manifiesto, el la etiqueta tiene el atributo android:launchMode, que puede ser uno de:

  • "estándar" Predeterminado. Se puede crear instancias varias veces, puede pertenecer a cualquier tarea y puede aparecer en cualquier parte de la pila. Normalmente, forma parte de la tarea que llamó a startActivity() a menos que se haya utilizado FLAG_ACTIVITY_NEW_TASK. Se crea una nueva instancia de la clase para responder a cada nuevo intento.

  • "singleTop" Idéntico al estándar, excepto que si la tarea de destino ya tiene una instancia de esta actividad en la parte superior de la pila, no se creará una nueva actividad. En su lugar, la actividad existente recibirá una llamada a onNewIntent().

  • "SingleTask" Solo puede haber uno. Es la primera actividad de una nueva pila y, por lo tanto, es la raíz de una pila de actividades. Si hay más intentos, se enviarán a onNewIntent().

  • "única instancia"Idéntico a singleTask, excepto que es la única actividad en su pila. Si intenta iniciar una nueva actividad, la nueva actividad iniciará una nueva tarea. Igual que si FLAG_ACTIVITY_NEW_TASK estuviera en la intención.

contestado el 15 de mayo de 13 a las 20:05

Personalmente, encuentro que la pila de historial en Android es más confusa que útil para los usuarios finales. El uso de botones de retroceso a menudo no puede hacer lo que el usuario espera.

Hay algunas opciones disponibles si desea utilizar actividades como construcción principal.

  1. Para actividades de tipo de flujo de trabajo (por ejemplo, formularios de captura), comience la primera actividad con Intent.FLAG_ACTIVITY_NEW_TASK y al final use FLAG_ACTIVITY_CLEAR_TASK

  2. Para las actividades de nivel superior que suelen ser un punto de retorno, comience la actividad con Intent.FLAG_ACTIVITY_CLEAR_TOP. Básicamente, esto verifica si la actividad ya está en algún lugar de la pila y si aparece todas las actividades que se encuentran por encima de ella en la pila y reanuda la actividad original.

Otro método posible para las actividades de nivel superior es usar una actividad de nivel superior y usar fragmentos para moverse, por ejemplo, navegador de pestañas, etc. Luego, simplemente use actividades para tareas separadas reales.

contestado el 15 de mayo de 13 a las 04:05

"si quieres usar actividades como construcción principal"... ¿Qué otras construcciones hay? - Siavash

Solo quise decir que para algunas aplicaciones pequeñas donde no hay mucho flujo de trabajo, puede ser más fácil usar una sola actividad principal como contenedor para fragmentos e intercambiar fragmentos en lugar de comenzar nuevas actividades. Sin embargo, está un poco fuera de tema y realmente no aborda el problema operativo. - Puerto de Lionel

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.