Android: reanuda una actividad con SingleTop o SingleTask

Ya he estado buscando soluciones sobre mi problema durante mucho tiempo, pero la documentación de Android no es tan clara y las soluciones web no funcionan por completo.

Estoy desarrollando un juego en el que la Actividad principal (donde se desarrolla el juego) puede llamar a otra Actividad simple y volver. Funcionaría así:

  1. Si el usuario hace clic en el botón Inicio y luego vuelve al juego, la actividad debe detenerse y luego reanudarse sin pasar el onDestroy (de lo contrario perdería el estado del juego)
  2. La misma función cuando la Actividad principal llama a la otra Actividad y luego regresa al juego.
  3. Cuando el usuario presiona el botón de salida, el juego debe salir

Para los dos primeros puntos he intentado esto para estar seguro de que una y una sola actividad principal se crea y se llama: android:launchMode="singleTask" o android:launchMode="singleTop" pero por desgracia el primero funciona para el primer problema y el segundo Para el segundo, no para ambos!

Creo que el problema es: con singleTop la actividad principal no está realmente en la parte superior de la pila cuando la segunda actividad lo llama (para ser claro, no entiendo cuál debería ser la situación en la que llamo una actividad que es Ya en la parte superior de la pila!). Por el contrario, el singleTask garantiza que la actividad es única en su pila, pero después de que los usuarios hagan clic en el botón Inicio y regresen a la aplicación se llama a la otra tarea, ¿estoy bien?

De todos modos, ¿es esto una solución inteligente o debo guardar el estado de mi juego en el onStop / onPause y luego reanudarlo en el onResume?

Para el tercer punto intenté añadir el android:noHistory="true" a cada Actividad, entonces cuando el usuario hace clic en el botón de salida llamo a una nueva Actividad que no hace nada excepto el método finish() en onCreate, esta Actividad se llama Con intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); Y su launchMode es singleInstance , pero no funciona, simplemente devuelve siempre en la actividad principal.

Usted definitivamente no quiere meterse con el launchMode . Ésa no es la manera de solucionar este problema y apenas le causará más problemas.

Android puede (y va a) matar su proceso cuando quiera (pero especialmente si su aplicación está en segundo plano). Debido a esto, usted necesita para guardar el estado de su juego en onPause() , porque esa es la única oportunidad que se garantiza tener.

De todos modos, si guarda el juego en onPause() el comportamiento estándar cubrirá sus primeros 2 puntos.

Para su tercer punto, hay algunas opciones:

  1. Puedes iniciar todas las actividades con startActivityForResult() ver mi respuesta aquí
  2. Cuando quiera "salir", puede regresar a su actividad raíz (la que inicia su aplicación) y decirle que desea salir.

Me gusta esto:

 Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack intent.addExtra("exit", "true"); // this tells your root activity that you want to exit startActivity(intent); 

Ahora, en su MyRootActivity desea agregar este código a onCreate() :

 Intent intent = getIntent(); if (intent.hasExtra("exit")) { // User wants to exit finish(); } 
  • No puede entender el filtro intencional
  • ¿Cómo puedo crear una Intención de Android que transporta datos?
  • FLAG_ACTIVITY_REORDER_TO_TOP haciendo que RuntimeException o la pantalla negra en rotación
  • Enumera todos los archivos y carpetas de la carpeta dropbox con la API de la bandeja de descarga y el archivo de descarga que se hace clic en android.
  • Android.intent.action.BOOT_COMPLETED La intención no se recibe en "Reiniciar" o "Reiniciar"
  • Pasar la matriz de valores entre dos actividades
  • Abrir un fragmento de una actividad de otra actividad
  • OnActivityResult no se llama a un dispositivo Android, sino que está en otro
  • Firefox para Android no inicia la aplicación cuando se hace clic en el enlace
  • El gestor de paquetes ha muerto
  • El constructor Intent (new View.OnClickListener () {}, Clase <DrinksTwitter>) no está definido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.