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.
- Cómo crear una nueva línea o pestaña en <string> XML (eclipse / android)?
- Cómo cambiar el color de entrada del imput en xml?
- Ellipsize no funciona para textView dentro de listView personalizado
- Obtener elementos por nombre de etiqueta de un nodo en documento de Android (XML)?
- Obtención de recursos de / res en dependencia
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.
- Barra de progreso personalizada en Android?
- Cómo puedo declarar un fragmento como oculto en un diseño XML
- SetCompoundDrawablesWithIntrinsicBounds (int, int, int, int) no funciona
- Obtener la imagen seleccionada de la galería en la vista de la imagen
- Logo de ActionBar mover hacia la izquierda
- Analizar elementos de la lista de archivos XML con XML simple en Android
- Con SAX Parser, obtiene el valor de un atributo
- Sombra larga de Android TextView
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.
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)
- ¿Cómo incluir la biblioteca Zxing en el proyecto android?
- Cómo acceder a los recursos de dibujo (color) en java