Fermez l’application et supprimez des applications récentes /

Je sais que cette question est fréquente et posée à plusieurs resockets sur Stack Overflow, mais après avoir visité presque les quatre pages des résultats des moteurs de recherche et presque la question de Stack Overflow concernant ce problème,

Ce que je veux:

Je veux afficher mon application dans la liste des applications récentes lorsqu’elle est en cours d’exécution, mais lorsque je ferme l’application, mon processus doit être supprimé et l’application supprimée de la liste des applications récentes.

Quelques réponses que j’ai trouvées:

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 

Et une suggestion commune que je vois dans chaque réponse qui ajoute le code ci-dessous dans le manifeste:

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

car après l’ajout de cela lorsque l’utilisateur appuie sur le bouton d’accueil pendant que mon application est en cours d’exécution, l’utilisateur ne peut pas voir mon application dans la liste récente des applications.

Et de nombreuses autres suggestions à ce sujet, mais aucune d’entre elles ne permet à la fois de fermer l’application et de supprimer l’application de la liste des applications récentes. Aussi, si vous allez dans Settings>Apps>yourApp>your Application voyez qu’elle vous demande toujours “force stop” pour signifier que l’application est en cours d’exécution!

J’ai basé ma solution sur l’invité ci-dessus, ainsi que les commentaires de gilsaints88 ci-dessous (pour la compatibilité Android L):

Ajoutez cette activité à votre fichier AndroidManifest.xml:

  

Ensuite, créez une classe 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); } } 

Ensuite, lorsque vous souhaitez forcer la fermeture de votre application et la supprimer de la liste récente, appelez:

 ExitActivity.exitApplication(context); 

Cette solution fonctionne pour moi au lieu de déclarer Android: excludeFromRecents = “true” car je souhaite que l’utilisateur puisse voir l’application dans la liste recents JUSQU’À ce que l’application déclenche la fermeture de l’application par programmation.

Avant de présenter ma tentative, je tiens à préciser que ce qui suit ne résoudra pas la disponibilité de “l’arrêt forcé” dans les informations de l’application. Android vous permet d’arrêter une application même si aucun processus n’est en cours d’exécution. L’arrêt forcé place le package dans un état d’arrêt spécifique, où il ne peut pas recevoir d’événements de diffusion.

Maintenant que c’est hors de propos, avec ma bonne idée pour cela. L’essentiel est de remplacer la tâche que vous souhaitez quitter par une tâche que le système exclura de la liste des applications récentes.

  1. Définissez une activité (je l’appellerai Exiter ) qui se termine immédiatement.
    • Appelez finish() dans onCreate(Bundle) .
    • De la question, il semble que l’OP voudra aussi appeler System.exit(int) aussi. Mais pour les autres personnes qui lisent cette réponse, vous n’avez généralement pas à tuer le processus.
    • Utilisez android:theme="@android:style/Theme.NoDisplay" pour éviter que cela ne provoque des transitions redondantes.
  2. Définissez android:taskAffinity pour que Exiter s’exécute dans la tâche que vous souhaitez quitter. Ou ne pas: par défaut, taskAffinity non taskAffinity fait en sorte que toutes les activités partagent une taskAffinity anonyme taskAffinity .
  3. Lorsque vous voulez quitter, utilisez startActivity(Intent) pour démarrer Exiter avec les indicateurs suivants:
    • Intent.FLAG_ACTIVITY_NEW_TASK – Même si nous voulons démarrer l’activité dans la même tâche, les autres indicateurs nécessitent cet indicateur. Heureusement, taskAffinity empêchera le système de démarrer une nouvelle tâche.
    • Intent.FLAG_ACTIVITY_CLEAR_TASK – Ceci termine toutes les activités de la tâche. Vous n’aurez pas à appeler finish() partout, juste dans Exiter .
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS – La tâche ne figurera pas dans la liste des applications récentes. Comme c’est la même tâche que celle qui se termine, cet indicateur supprime la tâche de la liste.

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

finishAndRemoveTask(); travaillé pour moi pour supprimer une application de la barre des tâches. Après avoir fermé l’application.

Ajoutez ceci à votre activité:

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

finishAndRemoveTask ()

Appelez ceci lorsque votre activité est terminée et devrait être fermée et la tâche devrait être complètement supprimée dans le cadre de la fin de l’activité racine de la tâche.

Solution pour 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

   

Ensuite, utilisez-le simplement comme méthode habituelle dans votre activité:

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