Fermer l'application et la supprimer des applications récentes/
je sais que cette question Est commune et posée plusieurs fois sur le débordement de la pile, mais après avoir visité presque les quatre pages des résultats du moteur de recherche et presque la question des 20 débordements de la pile concernant cette question, j'ai constaté qu'aucun d'eux n'est résolu ou répondu correctement.
Ce que je veux:
je veux montrer mon application dans la liste des applications récentes quand elle est en cours d'exécution mais quand je ferme l'application alors mon processus doit être tué et l'application doit être retirée de la récente la liste des applications.
Quelques réponses que 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 proposition commune que je vois dans chaque réponse qu'ajouter de code ci-dessous dans le manifeste:
android:excludeFromRecents //I think this is wrong approach.
parce qu'après avoir ajouté ceci lorsque l'utilisateur appuie sur le bouton home pendant que mon application est en cours d'exécution, l'utilisateur ne peut pas voir mon application dans la liste des applications récentes.
et beaucoup d'autres suggestions à ce sujet, mais aucune d'entre elles ne font à la fois l'application étroite des tâches et l'application claire de la liste des applications récentes. Aussi, si vous allez dans Settings>Apps>yourApp>your Application
voir qu'il demande toujours "force stop" signifie que l'application est en cours d'exécution!
5 réponses
j'ai basé ma solution sur guest's ci-dessus, ainsi que sur les commentaires de gilsaints88 ci-dessous (pour la compatibilité Android L):
Ajoutez cette activité à votre AndroidManifest.fichier xml:
<activity
android:name="com.example.ExitActivity"
android:theme="@android:style/Theme.NoDisplay"
android:autoRemoveFromRecents="true"/>
puis créer une Exitactivité de classe.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);
}
}
puis chaque fois que vous voulez 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" parce que je vous voulez que l'utilisateur soit en mesure de voir l'application dans la liste des modifications jusqu'au point où mon application déclenche la fermeture programmatique de l'application.
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 de l'application. Android vous permet d'arrêter une application même si elle n'a aucun processus en cours d'exécution. Forcez stop place le paquet dans un État d'arrêt précis, où il ne peut pas recevoir d'événements diffusés.
maintenant que c'est hors de question, continuez avec mon idée ringarde pour ça. L'essentiel, c'est de remplacer la tâche que vous voulez sortie avec un de ceux que le système va exclure de la récente liste des applications.
- définissez une activité (je l'appellerai
Exiter
) qui se termine immédiatement.- Appel
finish()
onCreate(Bundle)
. - à Partir de la question, il semble que les OP voudront aussi appeler
System.exit(int)
trop. Mais pour les autres personnes qui lisent cette réponse, vous n'avez généralement pas à tuer le processus. - Utiliser
android:theme="@android:style/Theme.NoDisplay"
pour empêcher cela de causer un tas de redondance transition.
- Appel
- Set
android:taskAffinity
alors queExiter
exécutera la tâche que vous voulez quitter. Ou à ne pas faire: par défaut, non spécifiétaskAffinity
fait en sorte que toutes les activités en commun un anonymetaskAffinity
. - quand vous voulez sortir, utilisez
startActivity(Intent)
démarrerExiter
avec les indicateurs suivants:Intent.FLAG_ACTIVITY_NEW_TASK
- Même si nous voulons commencer l'activité dans la même tâche, les autres drapeaux besoin de ce drapeau. Heureusement, letaskAffinity
empêchera le système de réellement démarrer une nouvelle tâche.Intent.FLAG_ACTIVITY_CLEAR_TASK
- Ce termine toutes les activités sur la tâche. Vous n'aurez pas à appelerfinish()
partout, juste enExiter
.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- La tâche ne sera pas récent dans la liste des applications. Puisque c'est la même tâche que celle qui sort, ce drapeau supprime la tâche de la liste.
finishAndRemoveTask();
a travaillé pour moi pour supprimer une application de taskbar. Après la fermeture de l'application.
ajoutez ceci à votre activité:
@Override
public void finish() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
super.finishAndRemoveTask();
}
else {
super.finish();
}
}
Appel lorsque votre activité est terminée et devrait être fermé et la tâche doit être complètement enlevé 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
<activity
android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
android:theme="@android:style/Theme.NoDisplay"
/>
alors il suffit de l'utiliser comme méthode usuall dans votre activité:
override fun boo() {
foo()
finishAndRemoveTaskCompat()
}