Pregunta

¿Es posible iniciar una actividad en la pila, la limpieza de toda la historia antes de que?

La situación

Tengo una pila actividad que o bien va A-> B-> C o B-> C (selecciona una pantalla de los usuarios de manera, pero muchos usuarios sólo tienen un único token).

En la pantalla C al usuario pueden tomar una acción que hace que la pantalla es incorrecto B, por lo que la aplicación quiere llevarlos a la pantalla A, independientemente de si ya está en la pila. Pantalla A continuación, debería ser el único elemento de la pila en mi solicitud.

Notas

Hay muchas otras preguntas similares, pero no he encontrado nada que responde a esta pregunta exacta. Traté de llamar getParent().finish() - esto siempre da lugar a una excepción de puntero nulo. FLAG_ACTIVITY_CLEAR_TOP sólo funciona si la actividad que ya está en la pila.

¿Fue útil?

Solución

En el nivel API se añadió 11 una nueva bandera de Intención sólo para esto: Intent.FLAG_ACTIVITY_CLEAR_TASK

Solo para aclarar, utilice la siguiente:

Java

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


Kotlin

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK


Por desgracia para API lvl <= 10, todavía no he encontrado una solución limpia para esto. Los "DontHackAndroidLikeThis" solución es de hecho pura hackery. No deberías hacer eso. :)

Editar Según comentario @ Ben Pearson 's, para la API <= 10 ahora se puede utilizar clase IntentCompat para el mismo. Uno puede utilizar el indicador de IntentCompat.FLAG_ACTIVITY_CLEAR_TASK a la tarea clara. Para que pueda apoyar el nivel pre API 11 también.

Otros consejos

Caso 1: Sólo dos actividad A y B:

A continuación, el flujo de actividad es A-> B .En clic BackButton de B tenemos que cerrar la aplicación a continuación, mientras que a partir de la actividad B Un solo acabado de llamada () esto evitará androide de almacenamiento de Actividad A en la Backstack.eg de actividad A es pantalla Splash de aplicación Loding /.

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

Caso 2: Más de dos activitiy:

Si hay un flujo como A-> B-> C-> D> B y al hacer clic en el botón de vuelta en la actividad B, mientras que viene de Actividad D.In ese caso debemos utilizar.

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

A continuación, la actividad B se iniciará desde el backstack en lugar de una nueva instancia debido Intent.FLAG_ACTIVITY_CLEAR_TOP y Intent.FLAG_ACTIVITY_NEW_TASK borra la pila y hace que la parte superior one.So cuando presionamos el botón de regreso toda la aplicación se dará por terminado.

Con la versión más reciente> = 16 API utilización de Android finishAffinity()

enfoque es adecuado para> = API 16.

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
  • Su es igual a comenzar nueva actividad, y borrar todos los pila.
  • O Reiniciar para MainActivity / FirstActivity.

Me pasó unas horas en este también ... y coinciden en que los sonidos FLAG_ACTIVITY_CLEAR_TOP como lo que uno quiere: borrar toda la pila, a excepción de la actividad que está siendo puesto en marcha, por lo que el botón Atrás sale de la aplicación. Sin embargo, como se mencionó Mike Repasar, FLAG_ACTIVITY_CLEAR_TOP sólo funciona cuando la actividad que se está lanzando ya está en la pila; cuando la actividad no está ahí, la bandera no hace nada.

¿Qué hacer? Ponga la actividad ser puesta en marcha en la pila con FLAG_ACTIVITY_NEW_TASK, lo que hace que la actividad del inicio de una nueva tarea en la pila de la historia. A continuación, añadir la bandera FLAG_ACTIVITY_CLEAR_TOP.

Ahora, cuando FLAG_ACTIVITY_CLEAR_TOP va a buscar a la nueva actividad en la pila, que va a ser allí y se detuvo antes de que todo lo demás se borra.

Aquí está mi función de cierre de sesión; Ver el parámetro es el botón al que la función de adjunto.

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

No debe cambiar la pila. botón de retroceso Android debería funcionar en un navegador web.

No puedo pensar en una manera de hacerlo, pero es un buen truco.

  • Haga su singleTask Actividades añadiéndolo a la AndroidManifest Ejemplo:

    <activity android:name=".activities.A"
              android:label="@string/A_title"
              android:launchMode="singleTask"/>
    
    <activity android:name=".activities.B"
              android:label="@string/B_title"
              android:launchMode="singleTask"/>
    
  • Extender Application que llevará a cabo la lógica de dónde ir.

Ejemplo:

public class DontHackAndroidLikeThis extends Application {

  private Stack<Activity> classes = new Stack<Activity>();

  public Activity getBackActivity() {
    return classes.pop();
  }

  public void addBackActivity(Activity activity) {
    classes.push(activity);
  }
}

De la A a B:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class); 
startActivity(this, B.class);

de B a C:

DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class); 
startActivity(this, C.class);

En C:

If ( shouldNotGoBackToB() ) {
  DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
  app.pop();
}

y manejar el botón de vuelta a pop() de la pila.

Una vez más, no deberías hacer esto:)

Inmediatamente después de iniciar una nueva actividad, utilizando startActivity, asegúrese de llamar finish() para que la actividad actual no es apilada detrás de la nueva.

Prueba esto:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);

Trate a continuación código,

Intent intent = new Intent(ManageProfileActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|
                Intent.FLAG_ACTIVITY_CLEAR_TASK| 
                Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Para mí no de los métodos anteriores no funciona.

Sólo hacer esto a borrar toda la actividad anterior

finishAffinity() // if you are in fragment use activity.finishAffinity()
Intent intent = new Intent(this, DestActivity.class); // with all flags you want
startActivity(intent)

he encontrado demasiado simple truco acaba de hacer este nuevo elemento añadido en AndroidManifest como: -

<activity android:name=".activityName"
          android:label="@string/app_name"
          android:noHistory="true"/>

la android:noHistory borrará su actividad no deseada de la pila.

A veces tu fuerza emulador de Android no DDMS herramienta Eclipse de conexión y pedir ADB para iniciar manualmente. En ese caso se puede iniciar o detener el ADB utilizando el símbolo del sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top