Borrar toda la pila de la historia y comenzar una nueva actividad en Android
-
28-09-2019 - |
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.
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 laAndroidManifest
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.