android - programacion - Termina todas las actividades a la vez
manual de android en pdf (16)
Tengo una aplicación con varias páginas, es decir, múltiples actividades y algunas de ellas permanecen abiertas.
¿Hay alguna forma de cerrar todas las actividades a la vez?
Estaba luchando con el mismo problema. Abriendo la página Acerca de y llamando a finish();
desde que no se cerraba la aplicación, en cambio, se estaba yendo a la actividad anterior y quería cerrar la aplicación desde la misma página.
Este es el código que funcionó para mí:
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);
finish();
Espero que esto ayude.
Hay tres soluciones para borrar el historial de actividad.
1) Puede escribir finish()
en el momento de comenzar una actividad nueva a través del intento.
2) Escribe android:noHistory="true"
en toda la etiqueta <activity>
en el archivo Androidmanifest.xml, usando esto si estás abierto a una nueva actividad y no escribes finish () en ese momento la actividad previa siempre está terminada, después de escribir tu actividad se ve así
<activity
android:name=".Splash_Screen_Activity"
android:label="@string/app_name"
android:noHistory="true">
</activity>
3) escriba system.exit(0)
para salir de la aplicación.
Hay un método finishAffinity()
en Activity
que finalizará la actividad actual y todas las actividades principales, pero solo funciona en Android 4.1 o superior.
Para API 16+, use
finishAffinity();
Para menor (Android 4.1 inferior), use
ActivityCompat.finishAffinity(YourActivity.this);
La mejor solución que he encontrado, que es compatible con dispositivos con nivel API <11
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Esta solución requiere una biblioteca de soporte de Android
Ninguna de las respuestas mencionadas anteriormente funcionó para mí. Pero investigué un poco más y finalmente obtuve la respuesta.
De hecho, solicitó cerrar la aplicación como lo necesitaba. entonces, agregue el siguiente código
finishAffinity();
Espero que esto los ayude chicos.
Para API 16+, use
finishAffinity();
Para menor, use
ActivityCompat.finishAffinity(YourActivity.this)
Problema con finishAffinity()
es que solo las actividades en su tarea actual están cerradas, pero las actividades con singleInstance
launchMode y en otras tareas aún se abren y se ponen en primer plano después de finishAffinity()
. El problema con System.exit(0)
es que finalizas el proceso de tu aplicación con todos los servicios en segundo plano y toda la memoria asignada y esto puede provocar efectos secundarios no deseados (por ejemplo, no recibir más notificaciones).
Aquí hay otras dos alternativas que resuelven ambos problemas :
- Use
ActivityLifecycleCallbacks
en su clase de aplicación para registrar actividades creadas y ciérrelas cuando sea necesario: https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10 - En las pruebas puede usar
ActivityLifecycleMonitorRegistry
: https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15
Puede almacenar un indicador booleano para representar si todas las actividades deben finalizar o no (más preferido en sus preferencias compartidas), entonces el método onStart()
de cada actividad debería tener algo como:
SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
finish();
}else
{
//...
}
Obviamente puedes configurar esta bandera como a continuación cuando necesites terminar todas las actividades (en la actividad actual) después de hacerlo, puedes llamar al método finish () en la actividad actual que dará como resultado terminar la actividad actual y actividades pop desde una hasta uno, el método onStart () de cada uno se ejecuta y hace que lo termine:
SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();
Si usa el método sugerido por @letsnurture, se encontrará con la pregunta de @gumuruh.
Puede intentar simplemente finalizarAfinity (), cierra todas las actividades actuales para que funcione en la v4.1 anterior
Puede usar el método finishAffinity()
que finalizará la actividad actual y todas las actividades principales. Pero funciona solo para API 16+
.
Uso de API 16+:
finishAffinity();
Por debajo del uso API 16:
ActivityCompat.finishAffinity(this); //with v4 support library
Para salir de la aplicación completa:
finishAffinity(); // Close all activites
System.exit(0); // closing files, releasing resources
Seguir dos banderas funcionó para mí. Borrarán todas las actividades anteriores y comenzarán una nueva
Intent intent = new Intent(getApplicationContext(), MyDetails.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Espero que esto ayude.
Si está buscando una solución que parece ser más "por libro" y diseñada metodológicamente (utilizando un BroadcastReceiver), es mejor que consulte el siguiente enlace: http://www.hrupin.com/2011/10/how-to-finish-all-activities-in-your-android-application-through-simple-call .
Se requiere un ligero cambio en la implementación propuesta que aparece en ese enlace: debe usar el método sendStickyBroadcast (Intención) (no olvide agregar el permiso BROADCAST_STICKY a su manifiesto) en lugar de sendBroadcast (Intención), para habilitar su pausó las actividades para poder recibir la transmisión y procesarla, y esto significa que también debe eliminar esa emisión pegajosa mientras reinicia su aplicación llamando al método removeStickyBroadcast (Intención) en el método onCreate () de la Actividad de apertura.
Aunque las soluciones basadas en StartActivity (...) antes mencionadas, a primera vista, parecen ser muy bonitas, elegantes, cortas, rápidas y fáciles de implementar, se sienten un poco "equivocadas" (para comenzar una actividad) con todo el potencial sobrecarga y recursos que pueden requerirse e involucrarse en él, solo para matarlo? ...)
Si está rooteado:
Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
Siempre que desee salir de todas las actividades abiertas, debe presionar un botón que carga la primera actividad que se ejecuta cuando se inicia la aplicación, luego borra todas las demás actividades y luego termina la última actividad restante. para hacerlo, aplique el siguiente código en su proyecto
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
El código anterior termina todas las actividades a excepción de FirstActivity. Entonces tenemos que terminar FirstActivity''s Ingrese el siguiente código en Firstactivity''s oncreate
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
y has terminado ...
Soy principiante en Java / Android, puede ser esta simple solución de ayuda para usted
PRIMERO , crea una clase estática
public class ActivityManager {
static Activity _step1;
static Activity _step2;
static Activity _step3;
public static void setActivity1(Activity activity)
{
_step1 = activity;
}
public static void setActivity2(Activity activity)
{
_step2 = activity;
}
public static void setActivity3(Activity activity)
{
_step3 = activity;
}
public static void finishAll()
{
_step1.finish();
_step2.finish();
_step3.finish();
}
}
ENTONCES cuando ejecuta una nueva actividad, guarde el enlace a su administrador (en el paso 1):
ActivityManager.setActivity1(this);
AddValuesToSharedPreferences();
Intent intent = new Intent(Step1.this, Step2.class);
startActivity(intent);
Y LUEGO en tu último paso termina todo:
public void OkExit(View v) throws IOException {
ActivityManager.finishAll();
}
Utilizar
finishAffinity ();
En lugar de:
System.exit(); or finish();
sale de la aplicación completa o de toda la actividad.