¿La aplicación de Android restablece el cambio de orientación, la mejor manera de manejar?

Así que estoy haciendo una aplicación básica de ajedrez para jugar con algunos elementos diversos de la programación de Android y hasta ahora estoy aprendiendo mucho, pero esta vez estoy perdido.

Cuando la orientación del emulador cambia, la actividad se restablece. Basado en mi investigación lo mismo sucederá cada vez que la aplicación se pausa / interrumpido, es decir. Cambio de teclado, llamada telefónica, pulsando la tecla de inicio, etc.

Obviamente, no es viable tener un juego de ajedrez constantemente restablecido, así que una vez más me encuentro necesitando aprender a solucionar este problema.

Mi investigación trae a colación algunas cosas principales, reemplazando el método onPaused en mi Actividad, escuchando para orientación, cambios de teclado en mi manifiesto (vía android: configChanges), utilizando Parcelables o Serialization.

He buscado un montón de código de ejemplo usando Pacelables, pero para ser honesto es demasiado confuso. Tal vez volver mañana con ojos frescos será beneficioso, pero ahora mismo, cuanto más miro a Parcelables, menos sentido tiene.

Mi aplicación utiliza un objeto de tabla, que tiene 64 objetos de celda (en una matriz 2D 8×8) y cada celda tiene un objeto de pieza, ya sea una pieza real o null si el espacio está vacío. Asumiendo que utilizo Parcelable o Serialization estoy asumiendo que tendría que Parcelize o Serialize cada clase, Board, Cell y Piece.

En primer lugar, es Parcelable o Serialization incluso lo correcto para estar mirando a este problema? Si es así, ¿se puede elegir Parcelable o Serializable para esto? ¿Y estoy correcto al suponer que cada uno de los tres objetos tendría que ser Parceled / Serialized? Finalmente, ¿alguien tiene un enlace a un tutorial simple de entender Parcelable? Cualquier cosa que me ayude a entender, y detener más dolores de cabeza en el camino cuando mi aplicación se expande aún más.

Cualquier ayuda sería apreciada.

En tu manifiesto en la etiqueta <Activity>, puedes añadir android: configChanges = "orientation | keyboardHidden", esto evitará que la actividad se recargue y llama a onConfigurationChanged () en cambio cuando se cambia la orientación o se oculta el teclado.

Si necesita realizar ajustes cuando ocurre cualquiera de estos eventos, puede anular onConfigurationChanged () en su actividad, si no todo lo que tiene que hacer es agregar la propiedad al manifiesto.

Algo como:

@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.myLayout); } 

Funciona perfectamente bien.

La manera predeterminada de los androides de manejar los acontecimientos es recrear la actividad. Básicamente usted maneja un proceso correctamente y todo funciona, no hay necesidad de preocuparse de manejar esas cosas manualmente.

Los Fundamentos de Aplicación tienen una visión general completa del ciclo de vida de la actividad, pero en pocas palabras desea guardar su estado de actividad en el método onSaveInstanceState () y utilizar el Bundle que obtiene en el onCreate (Bundle savedInstanceState) para restaurar el estado de su aplicación.

Si desea almacenar sus clases en el Bundle, su mejor opción es implementar la interfaz Parcelable . A continuación, para guardar su estado que hacer:

 protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("yourObject", mYourObject); } 

Y en el método onCreate simplemente haz lo siguiente:

 if (savedInstanceState != null) mYourObject = savedInstanceState.getParcelable("yourObject"); 

Por supuesto usted podría apenas convertir sus objetos en representaciones normales del arsenal que el paquete puede contener ya apenas saltar la puesta en práctica de la interfaz parcelable. Básicamente, agregue un método toArray () a su objeto y un método static fromArray (). Bueno, jugar y ver qué más le convenga.

O pegue esta línea en su OnCreate para que no roate. Problema resuelto.

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

Anula onRetainNonConfigurationInstance en tu clase de actividad.

En este método, debe devolver un objeto, sólo agrupar el estado de su juego en un único objeto de estado y devolverlo en este método. Asegúrese de que esto es sólo un objeto de estado, por lo que quiero decir que no debería tener identificadores de una actividad, ver, etc contenido dentro de él o usted obtendrá fugas de memoria.

En su método onCreate, llame a getLastNonConfigurationInstance para recuperar el objeto.

Usted no tiene que preocuparse de los detalles de la puesta en práctica (la serialización) androide se ocupa de eso.

Si aún no se ha cerciorado de que ha configurado su modo de inicio en el manifiesto a SingleTask o singleInstance, dependiendo de cuál se ajuste mejor a sus necesidades. De forma predeterminada, si alguien llega a casa y luego vuelve a su aplicación, se inicia una nueva copia de la actividad, si no se maneja o se configura para una sola instancia, obtendrá varias copias de la actividad del juego en ejecución.

Cuando guarde el estado del tablero, haga un int[64] y en cada posición almacene la pieza correspondiente. Así que 0 = vacío, 1 = peón blanco, 2 = caballero blanco, etc …

Al cargar el estado del tablero, iterar a través de la matriz y crear los objetos de pieza adecuada en las ubicaciones adecuadas.

Puede convertir el int [64] a una cadena para almacenar en SharedPreferences, o usarlo con un Parcelable o lo que sea. Sólo almacene los datos mínimos que necesita.

  • Cuando se utiliza un paquete de Android, ¿por qué se deserializa una pila serializada como ArrayList?
  • ¿Cómo serializar un paquete?
  • Cómo serializar / deserializar arrayList (Object)
  • Deserializar el mapa JSON usando Jackson no da el mapa correcto
  • ¿Cuál es la mejor manera de diseñar un servidor GWT "independiente de la plataforma"?
  • Serializar un objeto Drawable en Android
  • ¿Se limpia la actividad de Android instanceState durante la actualización de la aplicación?
  • Serialización de objetos para una nueva actividad
  • ¿Recomendaciones para datos persistentes en Android?
  • ¿Pasar el objeto GoogleApiClient a otra actividad?
  • Serialización Gson dependiendo del valor del campo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.