Eliminar una actividad de la stack de historial

Mi aplicación muestra una actividad de registro la primera vez que el usuario ejecuta la aplicación, se ve así:

  1. ActivitySplashScreen (Bienvenido al juego, regístrese para obtener una cuenta?)
  2. ActivitySplashScreenSignUp (genial, completa esta información)
  3. ActivityGameMain (pantalla principal del juego)

por lo que las actividades se inician exactamente en ese orden, cuando el usuario hace clic a través de un botón en cada pantalla.

Cuando el usuario pasa de la actividad n. ° 2 a la n. ° 3, ¿es posible eliminar por completo los n. ° 1 y n. ° 2 de la stack del historial. Me gustaría que, si el usuario está en el n. ° 3 y toca el botón Atrás, simplemente vaya a la pantalla de inicio, en lugar de volver a la pantalla de bienvenida.

Creo que puedo lograr esto con las tareas (es decir, comenzar una nueva tarea en el n. ° 3) pero quería ver si había un método más simple,

Gracias

Puede lograr esto configurando el atributo android:noHistory en "true" en las entradas relevantes de en su archivo AndroidManifest.xml . Por ejemplo:

  

Puede usar el reenvío para eliminar la actividad anterior de la stack de actividades al lanzar la siguiente. Hay un ejemplo de esto en el APIDemos , pero básicamente todo lo que estás haciendo es llamar a finish() inmediatamente después de llamar a startActivity() .

Sí, eche un vistazo a Intent.FLAG_ACTIVITY_NO_HISTORY .

Probablemente esta no sea la forma ideal de hacerlo. Si alguien tiene una mejor manera, estaré ansioso por implementarlo. Así es como logré esta tarea específica con sdk anterior a la versión 11.

en cada clase que desea irse cuando es tiempo claro, necesita hacer esto:

  ... interesting code stuff ... Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class); startActivityForResult(i, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == R.string.unwind_stack_result_id) { this.setResult(R.string.unwind_stack_result_id); this.finish(); } } 

luego, el que necesita activar la cadena de pops de la stack solo necesita llamarlo cuando quiera iniciarlo:

 NextActivity.this.setResult(R.string.unwind_stack_result_id); NextActivity.this.finish(); 

¡Entonces las actividades no están en la stack!
Recuerde amigos, que puede iniciar una actividad y luego comenzar a limpiar detrás de ella, la ejecución no sigue un único hilo (ui).

Una forma de que funcione antes de la API 11 es iniciar ActivityGameMain primero, luego en la onCreate de esa actividad, inicie su actividad ActivitySplashScreen . El ActivityGameMain no aparecerá cuando llame a startActivity demasiado pronto para el splash.

Luego puede borrar la stack al iniciar ActivityGameMain configurando estos indicadores en la intención:

 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

También debe agregar esto a ActivitySplashScreen:

 @Override public void onBackPressed() { moveTaskToBack(true); } 

De modo que presionar nuevamente en esa actividad no vuelve a su ActivityGameMain .

Supongo que no quiere que la pantalla de bienvenida vuelva a cualquiera de los dos, para lograr esto le sugiero que lo configure en noHistory en su AndroidManifest.xml . A continuación, coloque el código goBackPressed en su clase ActivitySplashScreenSignUp en su lugar.

Sin embargo, he encontrado algunas formas de romper esto. Inicie otra aplicación desde una notificación mientras se muestra ActivitySplashScreenSignUp y no se restablece el historial anterior.

La única forma real de solucionar esto es en API 11:

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

Yo uso de esta manera.

 Intent i = new Intent(MyOldActivity.this, MyNewActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) startActivity(i); 

Sé que llegué tarde a esto (han pasado dos años desde que se formuló la pregunta) pero logré esto al interceptar el botón de retroceso presionar. En lugar de buscar actividades específicas, simplemente miro el recuento y si es menor a 3, simplemente envía la aplicación a la parte posterior (pausando la aplicación y devolviendo al usuario a lo que estaba ejecutándose antes del lanzamiento). Reviso menos de tres porque solo tengo una pantalla de introducción. Además, verifico el recuento porque mi aplicación permite al usuario navegar de vuelta a la pantalla de inicio a través del menú, por lo que les permite realizar copias de seguridad a través de otras pantallas como normal si hay actividades distintas de la pantalla de introducción en la stack.

 //We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen //unless the application has been killed. Users can toggle the session mode with a menu item at all other times. @Override public void onBackPressed() { //Check the activity stack and see if it's more than two deep (initial screen and home screen) //If it's more than two deep, then let the app proccess the press ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE); List tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number int activityCount = tasks.get(0).numActivities; if (activityCount < 3) { moveTaskToBack(true); } else { super.onBackPressed(); } } 

Simplemente configure noHistory="true" en el archivo Manifest . Hace que la actividad se elimine de la backstack.

En el manifiesto puedes agregar:

 android:noHistory="true"  

También puedes llamar

 finish() 

inmediatamente después de llamar a startActivity (..)

para API> = 15 a API 23 otra solución no funciona en mi caso. finalmente obtengo este.

  Intent nextScreen = new Intent(currentActivity.this, MainActivity.class); nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(nextScreen); ActivityCompat.finishAffinity(currentActivity.this); 

Simplemente llame this.finish () antes de startActivity (intención) como this-

  Intent intent = new Intent(ActivityOne.this, ActivityTwo.class); this.finish(); startActivity(intent); 

Es una locura que nadie haya mencionado esta elegante solución. Esta debería ser la respuesta aceptada.

SplashActivity -> AuthActivity -> DashActivity

 if (!sessionManager.isLoggedIn()) { Intent intent = new Intent(context, AuthActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); context.startActivity(intent); finish(); } else { Intent intent = new Intent(context, DashActivity.class); context.startActivity(intent); finish(); } 

La clave aquí es usar intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); para la Activity intermediaria. Una vez que ese enlace intermedio se rompe, DashActivity será el primero y el último en la stack.

android:noHistory="true" es una mala solución, ya que causa problemas al confiar en la Activity como una callback, por ejemplo, en el onActivityResult . Esta es la solución recomendada y debe ser aceptada.

Es demasiado tarde, pero espero que ayude. La mayoría de las respuestas no apuntan en la dirección correcta. Hay dos banderas simples para tal cosa.

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

De los documentos de Android:

public static final int FLAG_ACTIVITY_CLEAR_TASK Agregado en el nivel API 11

 If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the 

actividad que se borrará antes de comenzar la actividad. Es decir, la actividad se convierte en la nueva raíz de una tarea que, de otro modo, estaría vacía, y todas las actividades anteriores finalizarán. Esto solo se puede usar junto con FLAG_ACTIVITY_NEW_TASK.

Prueba esto:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

es API Nivel 1, verifica el enlace .

    Intereting Posts