No se puede reanudar la actividad

En los últimos meses he estado desarrollando un motor de juego versátil en tiempo real, y he aprendido mucho, pero todavía me siento muy ingenuo cuando se trata del ciclo de vida de la aplicación. En concreto, estoy tratando de implementar una actividad que puede ser mezclado en el fondo por el usuario, a continuación, correctamente reiniciado.

Mi arquitectura actual es como tal: Tengo una actividad de lanzador de menú XML que puede crear una actividad de juego en tiempo real con la intención. Los datos relevantes en esta actividad de Juego se hacen referencia a través de estructuras de datos estáticos y variables. La actividad Game crea hilos de trabajo en la devolución de llamada onSurfaceCreate () de mi objeto SurfaceView.

Cuando un usuario presiona el botón Atrás, la actividad se destruye y se envían al menú XML en la actividad del lanzador. Bueno, por ahora. Cuando el usuario presiona el botón de inicio, la actividad se envía al fondo. Vale genial. Mis problemas surgen cuando el usuario intenta encontrar su camino de regreso en la actividad del juego una vez que se ha enviado al fondo. Cuando el usuario toca el ícono del lanzador, el juego se destruye y se vuelve a iniciar el menú. Además, cuando el usuario reanuda el juego a través del administrador de tareas, los incendios de devolución de llamada onSurfaceCreate () y los subprocesos de trabajo se inician, pero el juego se congela.

Entonces, tengo dos preguntas. Primero, ¿cómo puedo reanudar mi actividad a través del icono del lanzador, en lugar de volver a iniciar el juego? En segundo lugar, cuando reanudo mi actividad, ¿qué acciones son necesarias para reiniciar mis hilos de trabajo mientras persiste los datos del juego?

¡Gracias!

EDIT: Por solicitud, estoy incluyendo algunos código a continuación. Mi onSurfaceCreate es un poco complicado, envía un mensaje a otro hilo, que luego implementa la devolución de llamada. He comprobado que esta función de implementación se activa cuando se reanuda la actividad de juego.

protected void surfaceCreate() { Log.e(TAG, "surfaceCreate"); Thread gameThread = createGameThread(); gameThread.start(); } protected final void onResume() { super.onResume(); resume(); } protected final void onPause() { super.onPause(); pause(); } 

Estos métodos crípticos pause () y resume () simplemente establecen una variable booleana que evita que se ejecute alguna lógica de juego, no hacen nada para obstaculizar los subprocesos de trabajo, que deben continuar en bucle.

EDIT: Gracias Mohammad, por resolver mi primer problema (aunque más pequeño). Resulta que el icono del lanzador se comporta de forma diferente cuando no está conectado por USB al IDE. El segundo problema sigue sin resolverse.

EDIT: Todo el trabajo! El segundo problema resultó ser un problema único en mi código, me disculpo por eso. Espero que esta pregunta todavía puede ser útil para aquellos que tratan con el lanzador y los IDE.

Existen varios posibles problemas / soluciones enumerados en esta publicación. Esto incluye malentendidos del ciclo de vida de la actividad y la configuración de launchMode .

Primero, ¿cómo puedo reanudar mi actividad a través del icono del lanzador, en lugar de volver a iniciar el juego?

Es probable que falte la definición de sus métodos onResume () y onPause () . Los ejemplos están aquí:

http://developer.android.com/training/basics/activity-lifecycle/pausing.html

Directamente de la API:

OnPause () Se llama como parte del ciclo de vida de la actividad cuando una actividad va en segundo plano, pero aún no se ha matado.

OnResume () Se llama después onRestoreInstanceState (Bundle), onRestart () o onPause (), para que su actividad comience a interactuar con el usuario.

Al codificar una aplicación de Android, tienes que entender y seguir este flujo:

Comprueba el ciclo de vida de la actividad de Android :

http://developer.android.com/reference/android/app/Activity.html

Una teoría sobre su problema puede ser que es más probable que vaya a onStop () al pulsar el botón de inicio y el sistema operativo Android está buscando su onRestart (), pero no puede encontrarlo por lo tanto congelación / reinicio.

En segundo lugar, cuando reanudo mi actividad, ¿qué acciones son necesarias para reiniciar mis hilos de trabajo mientras persiste los datos del juego?

Cuidado de cómo se utiliza la palabra reiniciar . Desea pausar y reanudar la aplicación (no reiniciar). Guardar datos en onPause () (utilice una base de datos o cualquier otra función de guardar que desee). Cargar datos en onResume (). Aunque, la actividad debe reanudarse como normal si usted acaba de llenar estos métodos.

Ahora, si desea guardar el estado cuando reinicie la aplicación, debe guardar los estados en onStop () y / o onDestroy (). Debe cargar estados en onStart (). Con el fin de salvar los estados, puede comprobar esto:

https://stackoverflow.com/a/151940/2498729

Para aquellos que usan Eclipse (o cualquier otro IDE para ejecutar / probar su aplicación):

De lo que has descrito probablemente has sobrepasado android: launchMode en AndroidManifest.xml o si estás probando por "ejecutar como" de Eclipse intenta salir de la aplicación después de instalar y auto-iniciar. A continuación, vuelva a iniciar desde el emulador y pruebe el comportamiento del botón Inicio. Supongo que esto es porque Android no pone Actividades en la pila del sistema operativo cuando se inicia desde Eclipse y, a continuación, el comportamiento del botón Inicio no es como de costumbre. Si esto no resuelve su problema, intente leer http://developer.android.com/guide/topics/fundamentals.html#lmodes .

Tenía launchMode establecido en mi StartupActivity. Entonces lo quité (se fijó a "singleTask", se comporta como yo lo quiere, la aplicación es "reanudado" a la actividad que espero, es decir, no StartupActivity pero MainActivity.

Fuente:

https://stackoverflow.com/a/1619461/2498729

http://developer.android.com/guide/topics/manifest/activity-element.html

De acuerdo a esto:

https://stackoverflow.com/a/3002890/2498729

Debe cambiar su andoird: launchMode a " Standard " (o " default ").

 Standard: A > B > HOME > B (what you want) SingleTask: A > B > HOME > A (what you don't want) 
  • Android: Obtener todas las entradas seleccionadas de MultiSelectListPreference (SharedPreferences)
  • Dynamic Center Aligned ViewPager
  • ¿Qué errores se detectan en "build" en Android Studio - rol de Gradle
  • Android Studio no identifica el archivo xml como archivo de diseño
  • Android: uso del diseño XML desde el almacenamiento interno
  • Cómo configurar el valor predeterminado del widget switch en android
  • Color de fondo de elemento de lista seleccionado inesperadamente reutilizado después de desplazamiento de lista en tabletas
  • ¿El android string.xml soporta cualquier otra forma de xml?
  • El desplazamiento de texto no funciona
  • ¿Cómo hacer que una disposición lineal se pueda desplazar?
  • Crear vista sobre cardview en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.