web-dev-qa-db-fra.com

Fermer l'application et supprimer des applications récentes /

Je sais que cette question est courante et posée à plusieurs reprises sur Stack Overflow, mais après avoir consulté près des quatre pages de résultats des moteurs de recherche et presque la question de Stack Overflow concernant ce problème, j’ai constaté qu’aucune d’entre elles n’était résolue ou répondue correctement.

Ce que je veux:

Je souhaite 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 doit être supprimée de la liste des applications récentes.

Quelques réponses j'ai trouvé:

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 ajoute le code ci-dessous dans le manifeste:

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

car après avoir ajouté ceci lorsque l'utilisateur appuie sur le bouton d'accueil alors que mon application est en cours d'exécution, il ne peut pas voir mon application dans la liste des applications récentes.

Et de nombreuses autres suggestions à ce sujet, mais aucune d’elles ne ferme les deux tâches et n’efface les applications de la liste des applications récentes. Aussi, si vous allez dans Settings>Apps>yourApp>your Application _ voyez qu'il demande toujours "force stop" signifie que l'application est en cours d'exécution!

52
Hamad

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

Ajoutez cette activité à votre fichier AndroidManifest.xml:

<activity
    Android:name="com.example.ExitActivity"
    Android:theme="@Android:style/Theme.NoDisplay"
    Android:autoRemoveFromRecents="true"/>

Puis 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, chaque fois que vous souhaitez forcer la fermeture de votre application et la supprimer de la liste des dernières, 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 des messages récents JUSQU'À ce que mon application déclenche la fermeture de l'application par programme.

79
Luke

Avant de présenter ma tentative, je tiens à préciser que ce qui suit ne traitera pas de la disponibilité de "force stop" dans les informations sur l'application. Android vous permet de forcer l'arrêt d'une application même si aucun processus n'est en cours d'exécution. Forcer l'arrêt place le package dans un état arrêté, dans lequel il ne peut pas recevoir d'événements de diffusion.

Maintenant que cela est hors du chemin, avec mon idée ringarde pour cela. L’essentiel est de remplacer la tâche que vous voulez quitter par une autre que le système exclura de la liste des applications récentes.

  1. Définissez une activité (je l'appellerai Exiter) qui se termine elle-même immédiatement.
    • Appelez finish() dans onCreate(Bundle).
    • D'après la question, il semblerait que le PO voudra également appeler System.exit(int). Mais pour les autres lecteurs de 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 un tas de transitions redondantes.
  2. Définissez Android:taskAffinity Pour que Exiter s'exécute dans la tâche que vous souhaitez quitter. Ou pas: par défaut, non spécifié taskAffinity permet à toutes les activités de partager un même anonyme taskAffinity.
  3. Lorsque vous souhaitez 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, le 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, uniquement dans Exiter.
    • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - La tâche ne figurera pas dans la liste des applications récentes. Puisqu'il s'agit de la même tâche que celle qui est quittée, cet indicateur la supprime de la liste.

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

19
guest

Ajoutez ceci à votre activité:

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

finishAndRemoveTask ()

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

8
Benny

finishAndRemoveTask(); a travaillé pour moi pour supprimer une application de la barre des tâches. Après la fermeture de l'application.

7
Mahesh Kartan

La 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()
    }
}

AndroidManifest.xml

<activity
     Android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
     Android:theme="@Android:style/Theme.NoDisplay"
/>

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

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