Cerrar la aplicación y eliminar aplicaciones recientes /

Sé que esta pregunta es común y me preguntaron muchas veces sobre Stack Overflow, pero después de visitar casi las cuatro páginas de los resultados del motor de búsqueda y casi la pregunta 20 de Stack Overflow sobre este tema, descubrí que ninguno de ellos se resolvió o contestó correctamente.

Lo que quiero:

Quiero mostrar mi aplicación en la lista de aplicaciones recientes cuando se está ejecutando, pero cuando cierro la aplicación, mi proceso debe ser eliminado y la aplicación debe ser eliminada de la lista de aplicaciones recientes.

Algunas respuestas que encontré:

use System.exit(0); //doesn't clear app from recents OR use android.os.Process.killProcess(android.os.Process.myPid()); //doesn't clear app from recents OR use finish() or this.finish() or Activity.finish();// doesn't clear app from recents 

Y una sugerencia común que veo en cada respuesta que agrega código debajo en manifiesto:

 android:excludeFromRecents //I think this is wrong approach. 

porque después de agregar esto cuando el usuario presiona el botón de inicio mientras mi aplicación se está ejecutando, el usuario no puede ver mi aplicación en la lista de aplicaciones recientes.

Y muchas otras sugerencias sobre esto, pero ninguna de ellas hace que ambas tareas cierren la aplicación y la aplicación clara de la lista de aplicaciones recientes. Además, si Settings>Apps>yourApp>your Application ve que aún así se solicita “parada Settings>Apps>yourApp>your Application ” significa que la aplicación se está ejecutando.

Basé mi solución en la de arriba, así como los comentarios de gilsaints88 a continuación (para compatibilidad con Android L):

Agregue esta actividad a su archivo AndroidManifest.xml:

  

Luego crea una clase ExitActivity.java:

 public class ExitActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(android.os.Build.VERSION.SDK_INT >= 21) { finishAndRemoveTask(); } else { finish(); } } public static void exitApplication(Context context) { Intent intent = new Intent(context, ExitActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(intent); } } 

Luego, cuando quiera forzar el cierre de su aplicación y eliminarla de la lista reciente, llame a:

 ExitActivity.exitApplication(context); 

Esta solución funciona para mí en lugar de declarar android: excludeFromRecents = “true” porque quiero que el usuario pueda ver la aplicación en la lista actual HASTA que mi aplicación active el cierre programático de la aplicación.

Antes de presentar mi bash de esto, quiero dejar en claro que lo que sigue no abordará la disponibilidad de “forzar parada” en la información de la aplicación. Android le permite forzar la detención de una aplicación, incluso si no tiene ningún proceso en ejecución. Force stop coloca el paquete en un estado detenido específico, donde no puede recibir eventos de difusión.

Ahora que eso está fuera del camino, sigue con mi cursi idea de esto. La esencia de esto es reemplazar la tarea que desea salir con una que el sistema excluirá de la lista de aplicaciones recientes.

  1. Defina una actividad (lo llamaré Exiter ) que simplemente termina inmediatamente.
    • finish() llamada finish() en onCreate(Bundle) .
    • A partir de la pregunta, parece que el OP también querrá llamar a System.exit(int) también. Pero para otras personas que leen esta respuesta, generalmente no es necesario que mates el proceso.
    • Use android:theme="@android:style/Theme.NoDisplay" para evitar que esto provoque un montón de transiciones redundantes.
  2. Establezca android:taskAffinity para que Exiter se ejecute en la tarea que desea salir. O no: de forma predeterminada, la taskAffinity no especificada hace que todas las actividades compartan una taskAffinity anónima común. taskAffinity .
  3. Cuando desee salir, use startActivity(Intent) para iniciar Exiter con los siguientes indicadores:
    • Intent.FLAG_ACTIVITY_NEW_TASK – Aunque queremos iniciar la actividad en la misma tarea, las otras banderas requieren este indicador. Afortunadamente, taskAffinity evitará que el sistema realmente inicie una nueva tarea.
    • Intent.FLAG_ACTIVITY_CLEAR_TASK – Esto finaliza todas las actividades en la tarea. No tendrá que llamar a finish() todas partes, solo en Exiter .
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : la tarea no estará en la lista de aplicaciones recientes. Como es la misma tarea que la que está saliendo, esta bandera quita la tarea de la lista.

https://gist.github.com/anonymous/9884978

finishAndRemoveTask(); funcionó para mí para eliminar una aplicación de la barra de tareas. Después de cerrar la aplicación.

Agregue esto a su actividad:

 @Override public void finish() { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { super.finishAndRemoveTask(); } else { super.finish(); } } 

finishAndRemoveTask ()

Llámelo cuando su actividad esté completa y se cierre y la tarea se elimine por completo como parte de la finalización de la actividad raíz de la tarea.

Solución para Kotlin.

ExitHelper.kt

 fun Activity.finishAndRemoveTaskCompat() { if (android.os.Build.VERSION.SDK_INT >= 21) { finishAndRemoveTask() } else { val intent = Intent(this, ExitAndRemoveFromRecentAppsDummyActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NO_ANIMATION or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) startActivity(intent) } } class ExitAndRemoveFromRecentAppsDummyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) finish() } } 

Mainfest.xml

   

Entonces solo úsalo como método habitual en tu Actividad:

 override fun boo() { foo() finishAndRemoveTaskCompat() } 
    Intereting Posts