¿Por qué no usar siempre android: configChanges = "keyboardHidden | orientación"?

178

Me preguntaba ¿por qué no usar android:configChanges="keyboardHidden|orientation"en todas (casi todas;) las actividades?

Bienes:

  • no tiene que preocuparse por su actividad rotada
  • 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 forma flexible de tener diferentes diseños en diferentes orientaciones
  • no tan bueno cuando se usan fragmentos

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

Mikooos
fuente
66
También debe explicar lo que piensa keyboardHidden | orientación está haciendo
Blundell
Impide el uso de manejo nativo de cambios de configuración específicos y permite que la aplicación lo maneje, ¿no es así?
Mikooos
2
Es por eso que esta opción está ahí, si sabe lo que está haciendo (sin cambios en los recursos), úselo.
Puntero nulo
¿Por qué es más rápido que usar ScreenSize?
batmaci

Respuestas:

334

Fondo rapido

De manera predeterminada, cuando ocurren ciertos cambios de configuración clave 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 define android:configChanges="keyboardHidden|orientation"en su AndroidManifest, le está diciendo a Android: "No realice el restablecimiento predeterminado cuando se extrae el teclado o se gira el teléfono; quiero manejar esto yo mismo. Sí, sé lo que estoy haciendo "

¿Es esto algo bueno? Pronto veremos ...

¿Sin preocupaciones?

Una de las ventajas con las que comienza es que hay:

no tiene que preocuparse por su actividad rotada

En muchos casos, las personas creen erróneamente que cuando tienen un error generado por un cambio de orientación ("rotación"), simplemente pueden solucionarlo introduciéndolo android:configChanges="keyboardHidden|orientation".

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

Editar : Sin embargo, lo que es más importante, como hackbod señala en los comentarios, su actividad también se reiniciará cuando su aplicación esté en segundo plano y Android decida liberar algo de memoria eliminándola. Cuando el usuario vuelve 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 puede 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 sus actividades para que estén contentas con cualquier reinicio que Android les arroje. Esta es una buena práctica que lo ayudará en el futuro, así que acostúmbrese.

Entonces, ¿cuándo debo usarlo?

Como mencionó, hay una clara ventaja. Sobrescribir el cambio de configuración predeterminado para una rotación al manejarlo usted mismo acelerará las cosas. Sin embargo, esta velocidad tiene un precio de conveniencia.

En pocas palabras, si usa el mismo diseño para retrato y paisaje, está en buena forma al sobrescribir. 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 usa un diseño diferente cuando el dispositivo está en horizontal, el hecho de que Android vuelva a cargar su Actividad es bueno porque luego cargará el diseño correcto. [Si usa la anulación en una actividad de este tipo y desea hacer un nuevo diseño mágico en tiempo de ejecución ... bueno, buena suerte, está lejos de ser simple]

Sumario rápido

Por supuesto, si android:configChanges="keyboardHidden|orientation"es adecuado para usted, entonces úselo. Pero POR FAVOR, asegúrese de probar qué 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.

yydl
fuente
50
Vale la pena agregar que no manejar el reinicio de su actividad significa que tiene problemas más grandes que simplemente no manejar los cambios de configuración menos comunes. El reinicio de la actividad utilizado aquí es exactamente el mismo mecanismo que el modo en que Android restaura su actividad a su estado anterior cuando su aplicación se desactiva en segundo plano. Entonces, si no está haciendo esto correctamente, sus usuarios experimentarán que su aplicación al azar no regresa correctamente cuando regresan desde el fondo, dependiendo de si el proceso se ejecutó o no. Entonces, un gran beneficio: se asegura de que su aplicación se reinicie correctamente.
Hackbod
14
Desde Android 3.x en adelante, no deje de agregar "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientación", "screenSize", "smallestScreenSize"]
Michael Biermann
1
Me di cuenta de que cuando usa el atributo configChanges, su aplicación también ignora la función de bloqueo de orientación. ¿Cómo puedes resolver esto? si conoce la respuesta, escríbala aquí: stackoverflow.com/questions/24000361/…
desarrollador de Android
44
Please don't do the default reset when the keyboard is pulled out¡Nunca he visto un reinicio de actividad para sacar el teclado !
Muhammad Babar
así se reinicia ocasionales están bien en mi opinión ... asas configChanges mayoría de los casos para mí ... bueno, tal vez en algún otro tipo de aplicaciones esto puede ser un problema, pero depende realmente ....
Renetik
2

Desde mi punto de vista: si el diseño es el mismo en modo horizontal y vertical, también puede deshabilitar uno de los dos en su aplicación.

La razón por la que afirmo esto es que yo, 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.

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

kaspermoerch
fuente
44
Sí, fuimos con eso en la versión 1.0 de nuestra aplicación, para que coincida con nuestro lanzamiento de Apple. Fue presentado SOLO en retrato. Que se veía genial en mi Droid X, coincidimos exactamente con el comportamiento del teclado emergente de la versión IOS. Luego, el CFO instaló la aplicación en su Droid, la giró hacia un lado y abrió el teclado. Ups Lo que pasa con Android es que es una plataforma abierta y realmente no puedes predecir la configuración del hardware o lo que el usuario querrá hacer con él, por lo que probablemente deberías admitir ambas (todas) orientaciones por si acaso.
Tevo D
1
Lo que, por cierto, anuló nuestra configuración de solo retrato ya que era básicamente en el hardware que el paisaje era entonces la orientación normal, no alternativa. Lo que REALMENTE estropeó nuestro diseño :( y fue bastante vergonzoso, teniendo una falla importante en cuestión de segundos después de que él instaló la aplicación
Tevo D
1
¿Por qué intentabas que se comportara exactamente como iOS? :(
FunkTheMonk
77
@FunkTheMonk Desafortunadamente, vivimos en un mundo donde los empresarios toman decisiones técnicas. Incluso si argumenta en contra, la mitad del tiempo piensan que tienen razón de todos modos. Y controlan tu cheque de pago.
StackOverflowed
2
El uso de un solo diseño no significa que la pantalla se verá igual cuando se gire. Un diseño XML bien estructurado hará que las cosas cambien automáticamente para funcionar bien con dimensiones razonables, y los usuarios lo apreciarán.
Melinda Green el
-1

No veo por qué ... 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 depende realmente del tipo de aplicación y de cómo se restaura estado cuando la aplicación se reinicia ... Cuando una de mis aplicaciones se reinicia, el usuario vuelve a iniciar sesión y mi código abre la última actividad y el usuario pierde algunos pasos para volver a donde estaba, pero no es gran cosa. En otros, siempre se mantiene algún estado algún estado siempre se restaura al reiniciar. Cuando se reiniciaba la actividad, tenía que ser que la aplicación no se había utilizado o algo así ... así que no había ningún problema ... En el juego, por ejemplo, puede ser un problema o en algún otro tipo de aplicación que no conozco ...

Digo que cuando lo haces de esta manera, las aplicaciones simplemente funcionan bien en circunstancias normales. Y el código es mucho más legible sin un montón de lógica necesaria para guardar y restaurar donde solo puedes hacer nuevos errores y tienes que mantenerlo todo el tiempo ... seguro si Android se queda sin energía y mata tu ventana de 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 | orientación | screenLayout | uiMode | screenSize | smallestScreenSize" Pero entiendo que para algún tipo especial de aplicaciones puede no ser buena manera, pero la mayoría de las aplicaciones pueden vivir con esto simplemente bien.

Renetik
fuente
Hola, ¿alguien con conocimientos sobre este tema puede echar un vistazo a mi hilo: stackoverflow.com/questions/35941585/…? Necesito ayuda desesperadamente.
Luke Allison
Debería apoyar totalmente el guardado / reanudación de actividades ... manejarlo para la rotación no es diferente ... Usted dice que pierde algunos pasos ... si lo hace correctamente, no pierde ningún paso y restaura exactamente donde lo dejó el usuario ... incluso después de reiniciar el dispositivo.
HaMMeReD
No sé de qué estás hablando, pero 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 un montón de lógica necesaria para guardar y restaurar donde solo puedes hacer nuevos errores y tienes que mantenerlo todo el tiempo ... seguro si Android se queda sin energía y mata tu ventana de 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 ...
Renetik
Ignorar adherirse al contrato de Actividad (estado de guardar / restaurar) es una mala práctica, y este es un consejo terrible en general. Intente probar contra la muerte del proceso y vea dónde lo lleva su aplicación, y este comportamiento es una "circunstancia normal" completamente estándar si su usuario usa al menos 2-3 aplicaciones en su teléfono y cambia entre ellas.
EpicPandaForce
-3

Sí, creo que hacer una pausa lo hará más rápido que liberar al jugador. Sin embargo, todavía tengo la pausa.

Ahora he encontrado una solución que no detendrá 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 se llaman y, por lo tanto, la canción no se detiene.

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

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

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
Raul
fuente
Deberías estar usando un servicio para reproducir música. En serio, le estás diciendo a la gente que agregue código que todavía tiene "// TODO código auxiliar de método generado automáticamente". Solución descuidada. Tampoco funcionará bien, deberá volver a unir todas sus referencias, y si no lo hace, serán impredecibles en el mejor de los casos.
HaMMeReD