web-dev-qa-db-fra.com

Comment tuer une application avec toutes ses activités?

Duplicate possible:
Quitter une application - est-ce mal vu?

Je souhaite offrir à l'utilisateur une option pour quitter l'application car je dois supprimer certaines données sensibles stockées dans les SharedPreferences tant que l'application en a besoin.

Dès que l'utilisateur veut quitter, le mot de passe dans les références partagées doit être effacé et, bien sûr, toutes les activités de l'application doivent être fermées (cela n'a aucun sens de les exécuter sans le mot de passe connu - elles se bloqueraient).

Comment puis je faire ça?

System.exit(0) et finish() ne quittent que l'activité en cours - inutile. Je sais qu'il existe une application Taskmanager. Comment fait-on cela? Il est capable de tuer toute l'application ...

54
Nils

Lorsque vous utilisez la méthode finish (), le processus n'est pas complètement fermé, il fonctionne ENCORE en arrière-plan.

Veuillez utiliser ce code dans l'activité principale (veuillez ne pas utiliser dans toutes les activités ou sous-activités):

@Override
public void onBackPressed() {

    Android.os.Process.killProcess(Android.os.Process.myPid());
    // This above line close correctly
}
100
Thirumalvalavan

Vous avez raison: appeler finish() ne quittera que l'activité en cours, pas l'application entière. Cependant, il existe une solution de contournement pour cela:

Chaque fois que vous démarrez une activité, démarrez-la en utilisant startActivityForResult(...). Lorsque vous souhaitez fermer l'application entière, vous pouvez faire quelque chose comme ceci:

setResult(RESULT_CLOSE_ALL);
finish();

Puis, définissez chaque callback onActivityResult(...) de sorte qu'une activité renvoyée avec la valeur RESULT_CLOSE_ALL Appelle également finish():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Cela provoquera un effet de cascade fermant toutes les activités.

En outre, je soutiens la proposition de CommonsWare: enregistrez le mot de passe dans une variable afin qu’il soit détruit à la fermeture de l’application.

37
mtmurdock

Lorsque l'utilisateur souhaite quitter toutes les activités ouvertes, il doit appuyer sur un bouton qui charge la première activité qui s'exécute au démarrage de votre application, dans mon cas "LoginActivity".

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

Le code ci-dessus efface toutes les activités sauf LoginActivity. LoginActivity est la première activité qui est affichée lorsque l'utilisateur exécute le programme. Placez ensuite ce code dans onCreate de LoginActivity, pour indiquer quand il doit s'autodétruire lorsque le message 'Exit' est transmis.

    if (getIntent().getBooleanExtra("EXIT", false)) {
         finish();
    }

La réponse que vous obtenez à cette question à partir de la plate-forme Android est: "Ne créez pas de bouton de sortie. Terminez les activités que l'utilisateur ne souhaite plus, et le responsable de l'activité les nettoie comme il le voit en forme."

13
Eric Leschinski

qui est stocké dans SharesPreferences tant que l'application en a besoin.

Pourquoi?

Dès que l'utilisateur veut quitter, le mot de passe dans les références partagées doit être effacé et, bien sûr, toutes les activités de l'application doivent être fermées (cela n'a aucun sens de les exécuter sans le mot de passe connu - elles se bloqueraient).

Encore mieux: ne mettez pas le mot de passe dans SharedPreferences. Tenez-le dans un membre de données statique. Les données disparaîtront naturellement lorsque toutes les activités de l'application seront terminées (par exemple, le bouton RETOUR) ou autrement détruites (par exemple, expulsées de RAM pour faire de la place pour d'autres activités peu après que l'utilisateur ait appuyé sur la touche DOMICILE).

Si vous voulez une sorte de "mot de passe de vidage" proactif, définissez simplement le membre de données statique sur null, et demandez à vos activités de vérifier ce membre et de prendre les mesures appropriées quand il s'agit de null.

7
CommonsWare

Utilisation de la méthode onBackPressed():

@Override
public void onBackPressed() {    
    Android.os.Process.killProcess(Android.os.Process.myPid());
}

ou utiliser la méthode finish(), j'ai quelque chose comme

//Password Error, I call function
    Quit();             


    protected void Quit() {
        super.finish();
    }

Avec super.finish (), vous fermez l’activité de la super classe.

6
Jorgesys

D'après ce que j'ai compris du framework d'application Android, cela n'est pas spécifiquement autorisé. Une application est automatiquement fermée lorsqu'elle ne contient plus d'activités en cours. Essayer de créer un bouton "kill" est apparemment contraire à la conception prévue du système d'application.

Pour obtenir le type d'effet souhaité, vous pouvez lancer vos différentes activités avec startActivityForResult () et demander au bouton de sortie de renvoyer un résultat qui indique à l'activité parent de terminer (). Cette activité pourrait alors envoyer le même résultat dans le cadre de sa fonction onDestroy (), ce qui se répercuterait sur l'activité principale et ne générerait aucune activité en cours, ce qui entraînerait la fermeture de l'application.

3
tlayton