En cliquant sur le bouton de retour deux fois pour quitter une activité
J'ai remarqué cette tendance dans beaucoup d'applications Android et les jeux récemment: en cliquant sur le bouton "retour" pour "sortir" de la demande, un Toast
arrive avec un message similaire à "s'il vous Plaît cliquez sur RETOUR pour quitter".
Je me demandais, comme je le vois de plus en plus souvent, c'est qu'une fonctionnalité intégrée qui vous pouvez en quelque sorte l'accès à une activité? J'ai regardé le code source de nombreuses classes mais je n'arrive pas à trouver quelque chose à ce sujet.
Bien sûr, je peux penser à quelques-uns des moyens pour obtenir la même fonctionnalité assez facilement (le plus simple est probablement de garder un booléen dans l'activité qui indique si l'utilisateur a déjà cliqué une fois...) mais je me demandais si il y a quelque chose de déjà là.
MODIFIER: Comme @LAS_VEGAS mentionné, je n'ai pas vraiment de "sortie" dans le sens traditionnel du terme. (c'est à dire fin) je voulais dire "revenir à ce qui a été ouvert avant le démarrage de l'application d'activité a été lancée", si cela fait sens 🙂
- [Android - Confirmer app sortie avec toast] [1]: stackoverflow.com/questions/14006461/...
- J'ai eu le même problème lors de l'utilisation de la HoloEverywhere Bibliothèque, trop simplement, vous pouvez ajouter android:launchMode="singleTask" pour vous la définition de l'activité dans le fichier manifeste.
- Autre solution stackoverflow.com/questions/8430805/...
- Double Possible de en cliquant sur l'android arrière deux fois sur le bouton pour quitter l'application
Vous devez vous connecter pour publier un commentaire.
Je Pense que ce gestionnaire permet de réinitialiser la variable au bout de 2 seconde.
Sudheesh B Nair
pour couvrir les précédents commentaires.LENGTH_SHORT
Sudheesh B Nair's a une belle (et accepté) réponse sur la question, qui, je pense, devraient avoir une meilleure solution de rechange comme;
Quel est le problème avec la mesure du temps passé et de vérifier si
TIME_INTERVAL
milisecondes (2000) ont passé depuis la dernière sauvegarde de la presse. L'exemple de code suivant utiliseSystem.currentTimeMillis();
pour stocker le tempsonBackPressed()
est appelé;De retour sur accepté de répondre à critique; à l'Aide d'un
flag
d'indiquer si elle a été pressée dans la dernièreTIME_INTERVAL
(2000) millisecondes et set - reset est viaHandler
'spostDelayed()
méthode a été la première chose à venir dans mon esprit. Mais lepostDelayed()
action doit être annulée lorsqu'une activité est en cours de fermeture, le retrait de laRunnable
.Afin de supprimer les
Runnable
, il ne doit pas être déclaré anonyme, et être déclaré en tant que membre avec leHandler
aswell. PuisremoveCallbacks()
méthode deHandler
peut être appelé de manière appropriée.L'exemple suivant est la démonstration;
Grâce à @NSouth pour contribuer; afin de prévenir toast message apparaissent, même après la fermeture de l'application,
Toast
peut être déclarée en tant que membre - diremExitToast
- et peut être annulé parmExitToast.cancel();
juste avantsuper.onBackPressed();
appel.private Handler mHandler = new Handler()
et il fonctionne très bien maintenant. Je suis un peu nouveau pour les Gestionnaires, donc j'espère que c'est une mise en œuvre correcte.mBackPressed
être initialisé?if (fragmentManager.getBackStackEntryCount() != 0) {
dans le cas du Fragment-based ajouter"const int REQUIRED_COUNT = 3;
Remplacerboolean pressedOnce
avecint count = 0
. RemplacerpressedOnce = false
aveccount = 0
. RemplacerpressedOnce = true
avecpressedOnce += 1
. Remplacerif (pressedOnce)
avecif (counter >= REQUIRED_COUNT)
.Juste pensé que je voudrais partager comment je l'ai fait en fin de compte, j'ai juste ajouté dans mon activité:
Et il fonctionne exactement comme je le veux. Y compris la réinitialisation de l'état chaque fois que la reprise de l'activité.
Back
une fois, puis appuyez surBack
de nouveau une minute plus tard, et l'application va se fermer. Ce n'est pas le comportement que l'utilisateur attend.Diagramme De Flux De Processus:
De Code Java:
Il est très façon la plus simple parmi toutes ces réponses.
Simplement écrire le code suivant à l'intérieur
onBackPressed()
méthode.Vous devez définir
back_pressed
objet commelong
en activité.Basée sur la réponse correcte et suggestions dans les commentaires, j'ai créé une démo qui fonctionne tout à fait bien et supprime le gestionnaire des rappels après avoir été utilisés.
MainActivity.java
J'espère que ce sera utile !!
onBackPressed()
fixer le fuite de mémoire question?Ma solution à l'aide buvette:
Simple et élégant.
Déclarer La Variable
private boolean doubleBackToExitPressedOnce = false;
Ce n'est pas une bonne idée d'utiliser un Exécutable lorsque vous quittez l'application, j'ai récemment trouver un moyen beaucoup plus simple d'enregistrer et de comparer la période entre deux clics de bouton. Exemple de code suivant:
Cela fera l'affaire pour quitter l'application par un double clic sur un bouton dans un certain délai, qui est de 2000 millisecondes dans l'échantillon.
Ce n'est pas une fonctionnalité intégrée. Je pense qu'il n'est même recommandé de comportement. Les applications Android ne sont pas destinés à la sortie:
Pourquoi ne pas les applications Android de fournir une "Sortie" de l'option?
Accepté la réponse est Meilleur, mais si vous utilisez
modèle Android Support Library
ensuite, vous pouvez utiliserSnackBar
pour une Meilleure Vue.exitToast = Toast.makeText(getcontexteapplication ()", Appuyez sur retour pour quitter", Toast.LENGTH_SHORT);
Enfin créer un onBackPressedMethod comme Suit:
Cela fonctionne correctement, je l'ai testé. et je pense que c'est beaucoup plus simple.
Zefnus's réponse en utilisant le Système.currentTimeMillis() est la meilleure (+1). Je l'ai fait c'est pas mieux que cela, mais encore de les poster à ajouter pour les idées ci-dessus.
Si le pain n'est pas visible lorsque le dos est enfoncé, le toast est affiché, alors que, s'il est visible (retour a déjà été pressé une fois au cours de la dernière
Toast.LENGTH_SHORT
temps), puis il la quitte.Récemment, j'ai eu besoin de mettre en œuvre ce bouton retour fonctionnalité dans une application de la mine. Les réponses à la question d'origine ont été utiles, mais j'ai dû prendre plus de deux points en considération:
Sur la base des réponses et des commentaires, j'ai créé le code suivant:
Le code ci-dessus suppose que la bibliothèque de prise en charge est utilisé. Si vous utilisez des fragments, mais pas le soutien de la bibliothèque, vous voulez remplacer
getSupportFragmentManager()
pargetFragmentManager()
.Supprimer le premier
if
, si le bouton retour n'est jamais annulée. Supprimer la deuxièmeif
, si vous n'utilisez pas de fragments ou d'un fragment de la pile de retourAussi, il est important d'être conscient que la méthode
onBackPressed
est pris en charge depuis Android 2.0. Vérifier cette page pour élaborer une description. Pour faire le dos de presse de la fonctionnalité de travailler sur des versions plus anciennes, ajoutez la méthode suivante à votre activité:En java
Dans kotlin
Je sais que c'est une très vieille question, mais c'est la façon la plus simple de faire ce que vous voulez.
Je sais que ce n'est pas la meilleure méthode, mais il fonctionne très bien!
show()
le ToastPour cet effet, j'ai mis en œuvre la fonction suivante:
Cela aide aussi quand vous avez pile précédent de l'activité stockée dans la pile.
J'ai modifié Sudheesh la réponse de
Voici tout le code de travail. Et aussi n'oubliez pas de supprimer les rappels de sorte qu'il ne provoque une fuite de mémoire dans l'application. 🙂
Ici, j'ai généralisé écrire le code pour N appuyez sur compte. Le code est écrit de la même façon pour l'Activer, option Développeur d'android, appareil de téléphone. Même si vous pouvez utiliser cette option pour activer les fonctionnalités de tout test du développeur de l'application.
Appel askToExit() sur backpress ou option de déconnexion.
Quand HomeActivity contiennent de navigation tiroir et double backPressed() fonction de la sortie de l'app.
(N'oubliez pas de initilize global variable booléenne doubleBackToExitPressedOnce = false;)
nouveau gestionnaire, au bout de 2 sec définir doubleBackPressedOnce variable à false
Quelques Améliorations dans Sudheesh B Nair réponse, j'ai remarqué qu'il va attendre que gestionnaire, même en appuyant deux fois sur retour immédiatement, afin d'annuler gestionnaire comme indiqué ci-dessous. J'ai annulée pour des toasts aussi, pour éviter d'affichage après l'application de sortie.
Légèrement meilleure méthode que la Zefnus je pense. Système D'Appel.currentTimeMillis() une seule fois et omettre
return;
:C'est la même chose de l'accepté et le plus voté réponse, mais ce ciselée utilisé snack-bar au lieu de pain grillé.
Dans mon cas, j'ai dépendent
Snackbar#isShown()
pour mieuxUX
.Pour l'activité dont l'un est d'avoir de Navigation Tiroir, Utilisez le code suivant pour OnBackPressed()
- Je utiliser ce
utiliser pour en cas
onBackPressed
ou
ExitApp.now(this,R.string.double_back_pressed)
pour changer les secondes ont besoin pour fermer, spécifié en millisecondes
ExitApp.now(this,R.string.double_back_pressed,5000)
Ici est d'une autre façon... à l'aide de la CountDownTimer méthode
Dans cette situation, Buvette est la meilleure option, puis les faire griller pour afficher l'action quitter. Voici la méthode avec snack-bar qui fonctionne.
Normalement j'ajoutez un commentaire, mais ma réputation ne permet pas ceci.
Voici donc mes deux cents:
Dans Kotlin vous pouvez utiliser les coroutines à retarder la mise à false:
Vous aurez à importer:
Après avoir eu à mettre en œuvre les mêmes choses plusieurs fois, a décidé de son temps que quelqu'un construit une utilisation simple de la bibliothèque. Et c'est
DoubleBackPress Android library
. LeREADME
explique toutes les Api fournies avec des Exemples (comme ToastDisplay + Sortie De L'Activité), mais un bref rappel des étapes ici.Pour ce faire, commencez par ajouter le
dependency
à votre demande :Ensuite, créez un
DoubleBackPress
objet dans votreActivity
ce qui est du comportement.Puis créer un
Toast
qui doit être présenté lors de la Premier Retour Appuyez sur. Ici, vous pouvez créer votre propreToast
, ou aller avecStandard Toast
fourni dans lelibrary
. Faire la même chose ici par l'option ultérieure.Maintenant, de définir ce qui doit se produire lorsque votre Deuxième Retour de la Presse qui se passe. Ici, nous sommes à la fermeture de l'Activité.
Enfin, remplacer votre retour appuyez sur le comportement avec le
DoubleBackPress
comportement.Exemple GIF de similaires sur le comportement des exigences
vous pouvez même en faire plus simple, et sans l'aide d'un virage, seulement le faire =)
Vous pouvez également utiliser la visibilité d'un Toast, de sorte que vous n'avez pas besoin que Gestionnaire/postDelayed ultra solution.
Dans Kotlin sur le retour appuyez sur cette touche pour quitter l'application, vous pouvez utiliser:
Définir une variable globale:
Remplacer onBackPressed:
Voici mon point de vue sur ce :
Ici est une façon de le faire à l'aide de RxJava:
En arrière quand une Touche est appuyée 2 fois
Meilleure Solution avec des Toasts
Je pense que ce que vous avez besoin, je veux dire quand nous voulons montrer ce toast, quand il y a une seule activité dans la pile et de l'utilisateur en appuyant sur l'arrière de cette dernière activité de la pile.
et dans
onBackPressed
changement de méthode comme:Ici,
isTaskRoot
renvoie true si l'activité en cours est la racine de l'activité(activité) de la pile, et false si elle ne l'est pas.Vous pouvez consulter la documentation officielle ici