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.
Exiter
) qui se termine immédiatement.
finish()
dans onCreate(Bundle)
. System.exit(int)
aussi. Mais pour les autres personnes qui lisent cette réponse, vous n’avez généralement pas à tuer le processus. android:theme="@android:style/Theme.NoDisplay"
pour éviter que cela ne provoque des transitions redondantes. 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
. 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. 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() }