destruir - cerrar todas las actividades android studio
Borrar toda la pila de historial e iniciar una nueva actividad en Android (11)
En el nivel 11 de API, se agregó una nueva Intent.FLAG_ACTIVITY_CLEAR_TASK intención solo para esto: Intent.FLAG_ACTIVITY_CLEAR_TASK
Solo para aclarar, usa esto:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
Desafortunadamente para API lvl <= 10, todavía no he encontrado una solución limpia para esto. La solución "DontHackAndroidLikeThis" es, de hecho, pura piratería. No deberías hacer eso. :)
Edición: según el comentario de IntentCompat Pearson , para API <= 10 ahora se puede usar la clase IntentCompat para la misma. Se puede usar el indicador IntentCompat.FLAG_ACTIVITY_CLEAR_TASK
para borrar la tarea. Por lo tanto, también puedes soportar el nivel 11 de API.
¿Es posible iniciar una actividad en la pila, borrando todo el historial anterior?
La situación
Tengo una pila de actividades que va A-> B-> C o B-> C (la pantalla A selecciona el token de los usuarios, pero muchos usuarios solo tienen un token único).
En la pantalla C, el usuario puede realizar una acción que hace que la pantalla B no sea válida, por lo que la aplicación desea llevarlos a la pantalla A, independientemente de si ya está en la pila. La pantalla A debería ser el único elemento de la pila en mi aplicación.
Notas
Hay muchas otras preguntas similares, pero no he encontrado nada que responda a esta pregunta exacta. Intenté llamar a getParent().finish()
: esto siempre produce una excepción de puntero nulo. FLAG_ACTIVITY_CLEAR_TOP
solo funciona si la actividad ya está en la pila.
En ocasiones, es posible que el emulador de Android no pueda conectar la herramienta DDMS de Eclipse y pedir que se inicie manualmente. En ese caso, puede iniciar o detener el adb mediante el símbolo del sistema.
He descubierto que el pirateo es muy simple, solo agrega este nuevo elemento en AndroidManifest
como:
<activity android:name=".activityName" android:label="@string/app_name" android:noHistory="true"/>
android:noHistory
borrará tu actividad no deseada de Stack.
Inmediatamente después de comenzar una nueva actividad, utilizando startActivity
, asegúrese de llamar a finish()
para que la actividad actual no se apile detrás de la nueva.
Intenta debajo del código,
<activity android:name=".activityName"
android:label="@string/app_name"
android:noHistory="true"/>
No deberías cambiar la pila. El botón de retroceso de Android debería funcionar como en un navegador web.
Se me ocurre una manera de hacerlo, pero es un truco.
Haga que sus actividades
singleTask
de unasingleTask
agregándolas al ejemplo deAndroidManifest
:<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 la
Application
que mantendrá 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 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);
Cía:
If ( shouldNotGoBackToB() ) {
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.pop();
}
y maneja el botón Atrás para que pop()
de la pila.
Una vez más, no deberías hacer esto :)
Pasé algunas horas en esto también ... y estoy de acuerdo en que FLAG_ACTIVITY_CLEAR_TOP suena como lo que quieres: borra toda la pila, excepto la actividad que se inicia, por lo que el botón Atrás sale de la aplicación. Sin embargo, como mencionó Mike Repass, FLAG_ACTIVITY_CLEAR_TOP solo funciona cuando la actividad que estás iniciando ya está en la pila; Cuando la actividad no está ahí, la bandera no hace nada.
¿Qué hacer? Coloque la actividad que se está iniciando en la pila con FLAG_ACTIVITY_NEW_TASK, lo que hace que esa actividad sea el inicio de una nueva tarea en la pila de historial. A continuación, agregue el indicador FLAG_ACTIVITY_CLEAR_TOP.
Ahora, cuando FLAG_ACTIVITY_CLEAR_TOP va a buscar la nueva actividad en la pila, estará allí y se detendrá antes de que se elimine todo lo demás.
Aquí está mi función de cierre de sesión; El parámetro Ver es el botón al que se adjunta la función.
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();
}
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();
Caso 1: Sólo dos actividades A y B:
Aquí, el flujo de la actividad es A-> B. Al hacer clic en el botón Back de B, necesitamos cerrar la aplicación y al iniciar la Actividad B desde A, simplemente finalice () esto evitará que Android almacene la Actividad A en Backstack.eg para la actividad A es Pantalla de alojamiento / Splash de aplicación.
Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();
Caso 2: Más de dos actividades:
Si hay un flujo como A-> B-> C-> D-> B y al hacer clic en el botón Atrás en la Actividad B mientras venimos de la Actividad D. En ese caso, debemos usarlo.
Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
Aquí, la Actividad B se iniciará desde el backstack en lugar de una nueva instancia debido a que Intent.FLAG_ACTIVITY_CLEAR_TOP e Intent.FLAG_ACTIVITY_NEW_TASK borran la pila y la convierten en la primera. Así que cuando presionemos el botón Atrás, toda la aplicación terminará.
Con la versión más reciente de Android> = API 16 use finishAffinity()
El enfoque es adecuado para> = API 16.
Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);
- Es lo mismo que iniciar una nueva actividad y borrar toda la pila.
- O reinicie en MainActivity / FirstActivity.
Intent i = new Intent(MainPoliticalLogin.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);