¿Por qué no usar siempre android: configChanges = “keyboardHidden | orientation”?

Me preguntaba por qué no usar android:configChanges="keyboardHidden|orientation" en cada actividad (casi cada;))

Bienes:

  • no hay necesidad de preocuparse por la rotación de su actividad
  • es mas rapido

No tan lindo:

  • necesita cambiar sus diseños si dependen del tamaño de la pantalla (por ejemplo, diseños con dos columnas más o menos)

Malo:

  • no hay una manera flexible de tener diferentes diseños con diferente orientación
  • no tan bueno cuando se usan fragmentos

Pero si no usamos diseños diferentes, ¿por qué no?

Antecedentes rápidos

De forma predeterminada, cuando ciertos cambios de configuración de claves suceden en Android (un ejemplo común es un cambio de orientación), Android reinicia completamente la Actividad en ejecución para ayudarlo a adaptarse a dichos cambios.

Cuando defines android:configChanges="keyboardHidden|orientation" en tu AndroidManifest, le estás diciendo a Android: “Por favor, no realices el reinicio por defecto cuando se tira del teclado, o se gira el teléfono, quiero manejarlo yo mismo. Sí, sé lo que estoy haciendo ”

¿Es esto algo bueno? Pronto veremos …

¿Sin preocupaciones?

Uno de los profesionales con los que comienzas es que hay:

no hay necesidad de preocuparse por la rotación de su actividad

En muchos casos, las personas creen erróneamente que cuando tienen un error generado por un cambio de orientación (“rotación”), simplemente pueden arreglarlo colocando en android:configChanges="keyboardHidden|orientation" .

Sin embargo, android: configChanges = “keyboardHidden | orientation” no es más que un bandaid. En verdad, hay muchas formas en que se puede activar un cambio de configuración. Por ejemplo, si el usuario selecciona un idioma nuevo (es decir, la configuración regional ha cambiado), su actividad se reiniciará de la misma manera que lo hace mediante un cambio de orientación. Si lo desea, puede ver una lista de todos los diferentes tipos de cambios de configuración .

Editar : lo más importante, sin embargo, como señala Hackbod en los comentarios, tu actividad también se reiniciará cuando tu aplicación esté en segundo plano y Android decida liberar algo de memoria matándola. Cuando el usuario regrese a su aplicación, Android intentará reiniciar la actividad de la misma manera que si hubiera algún otro cambio de configuración. Si no puedes manejar eso, el usuario no estará contento …

En otras palabras, usar android:configChanges="keyboardHidden|orientation" no es una solución para sus “preocupaciones”. La forma correcta es codificar tus actividades para que estén contentos con cualquier reinicio que Android les arroje. Esta es una buena práctica que te ayudará en el futuro, así que acostúmbrate.

Entonces, ¿cuándo debería usarlo?

Como mencionaste, hay una clara ventaja. Sobrescribir el cambio de configuración predeterminado para una rotación manejándolo usted mismo acelerará las cosas. Sin embargo, esta velocidad viene con un precio de conveniencia.

Para decirlo simplemente, si utiliza el mismo diseño tanto para retrato como para paisaje, estará en buena forma haciendo la sobrescritura. En lugar de una recarga completa de la actividad, las vistas simplemente cambiarán para llenar el espacio restante.

Sin embargo , si por alguna razón utiliza un diseño diferente cuando el dispositivo está en el paisaje, el hecho de que Android vuelva a cargar su Actividad es bueno porque luego cargará el diseño correcto. [Si usas la anulación de dicha actividad, y quieres hacer un re-diseño mágico en tiempo de ejecución … bueno, buena suerte – está lejos de ser simple]

Sumario rápido

Por android:configChanges="keyboardHidden|orientation" , si android:configChanges="keyboardHidden|orientation" es adecuado para usted, entonces android:configChanges="keyboardHidden|orientation" . Pero POR FAVOR, asegúrese de probar lo que sucede cuando algo cambia, porque un cambio de orientación no es la única forma en que se puede activar un reinicio completo de la actividad.

Desde mi punto de vista: si el diseño es el mismo tanto en modo horizontal como vertical, también puedes desactivar uno de los dos en tu aplicación.

La razón por la que declaro esto es que, como usuario, espero que la aplicación me brinde algún beneficio cuando cambio de orientación. Si no importa cómo sostengo mi teléfono, entonces no necesito la opción.

Tome, por ejemplo, una aplicación donde tiene un ListView, y al hacer clic en un ListItem desea que se muestre una vista detallada de ese elemento. En landscape lo harías dividiendo la pantalla en dos, teniendo el ListView a la izquierda y la vista detallada a la derecha. En Vertical, tendría la lista en una pantalla y luego cambiaría la pantalla a la vista detallada cuando se selecciona un ListItem. En ese caso, el cambio de orientación tiene sentido, así como diferentes diseños.

No veo por qué … los reinicios ocasionales están bien en mi opinión … configChanges maneja la mayoría de los casos para mí … bueno, tal vez en algunos tipos de aplicaciones esto puede ser un problema, pero realmente depende del tipo de aplicación y cómo restaurar indicar cuando se reinicia la aplicación … Cuando uno de mis usuarios de la aplicación se reinicia, mi código abre la última actividad y el usuario jus pierde algunos pasos para volver a donde estaba, pero no es gran cosa. En otros, un estado siempre se conserva y algún estado siempre se restaura al reiniciar. Cuando la actividad se reinició tenía que ser que la aplicación no se había usado o algo así … así que no hay ningún problema … En el juego, por ejemplo, esto puede ser un problema, tal vez o en algún otro tipo de aplicación, no sé …

Digo que cuando lo haces de esta manera, las aplicaciones funcionan bien en circunstancias normales. Y el código es mucho más legible sin una gran cantidad de lógica necesaria para guardar y restaurar donde solo puedes crear nuevos errores y tener que mantenerlo todo el tiempo … seguro si Android se sale del poder y te mata la ventana de la aplicación, pierde el contexto y comienza de nuevo, pero esto sucede solo en situaciones especiales y en dispositivos más nuevos Creo que esto es cada vez más raro …

Así que mátame, pero uso esto en todas las aplicaciones con bastante éxito … android: configChanges = “locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize” Pero entiendo que para algunos tipos especiales de aplicaciones puede no serlo buena manera, pero la mayoría de las aplicaciones pueden vivir con esto simplemente está bien.

Sí, creo que pausar lo hará más rápido que soltar al jugador. Aún tengo la pausa sin embargo.

Ahora he encontrado una solución que no pausará la canción.

Indique en el manifiesto que manejará el cambio de configuración para la orientación de la pantalla y luego usará el método onConfigurationChanged para cargar el archivo de diseño. Al hacer esto en logCat puedo ver que onPause, onCreate y onResume no son llamados, y por lo tanto la canción no está en pausa.

  1. actualice el manifiesto para manejar la orientación.

     android:configChanges="orientation|screenSize" 
  2. agregue este código

     @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_main); }