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!
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.
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.
Exiter
) qui se termine elle-même immédiatement. finish()
dans onCreate(Bundle)
.System.exit(int)
. Mais pour les autres lecteurs de 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 un tas de transitions redondantes.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
.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.Ajoutez ceci à votre activité:
@Override
public void finish() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
super.finishAndRemoveTask();
}
else {
super.finish();
}
}
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.
finishAndRemoveTask();
a travaillé pour moi pour supprimer une application de la barre des tâches. Après la fermeture de l'application.
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()
}