J'ai récemment remarqué ce modèle dans de nombreuses applications et jeux Android: lorsque vous cliquez sur le bouton Précédent pour "quitter" l'application, Toast
un message similaire à "Veuillez cliquer à nouveau sur RETOUR pour quitter" s'affiche.
Je me demandais, comme je le vois de plus en plus souvent, est-ce une fonctionnalité intégrée à laquelle vous pouvez accéder d'une manière ou d'une autre dans une activité? J'ai regardé le code source de nombreuses classes mais je n'arrive pas à trouver quoi que ce soit à ce sujet.
Bien sûr, je peux penser à quelques façons d'obtenir la même fonctionnalité assez facilement (la 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 s'il y avait déjà quelque chose ici .
EDIT : Comme @LAS_VEGAS l'a mentionné, je ne voulais pas vraiment dire «sortie» au sens traditionnel. (c'est-à-dire terminé), je voulais dire "revenir à tout ce qui était ouvert avant le lancement de l'activité de démarrage de l'application", si cela a du sens :)
la source
Réponses:
Je pense que ce gestionnaire permet de réinitialiser la variable après 2 secondes.
la source
Sudheesh B Nair
pour couvrir les commentaires suggérés ci-dessus.Sudheesh B Nair a une réponse agréable (et acceptée) à la question, qui je pense devrait avoir une meilleure alternative telle que;
Quel est le problème avec la mesure du temps écoulé et la vérification si les
TIME_INTERVAL
millisecondes (disons 2000) se sont écoulées depuis la dernière pression arrière. L'exemple de code suivant utiliseSystem.currentTimeMillis();
pour stocker l'heureonBackPressed()
est appelé;Retour sur la critique des réponses acceptées ; Utiliser une
flag
pour indiquer si elle a été pressée au cours des dernièresTIME_INTERVAL
(disons 2000) millisecondes et set - reset est parHandler
lapostDelayed()
méthode de via a été la première chose qui m'est venue à l'esprit. Mais l'postDelayed()
action doit être annulée à la fermeture de l'activité, supprimant leRunnable
.Afin de supprimer le
Runnable
, il ne doit pas être déclaré anonyme et être déclaré comme membre avec l'Handler
aswell. Ensuite, laremoveCallbacks()
méthode deHandler
peut être appelée de manière appropriée.L'exemple suivant est la démonstration;
Merci à @NSouth pour sa contribution; Afin d'éviter que le message toast n'apparaisse même après la fermeture de l'application, il
Toast
peut être déclaré membre - disonsmExitToast
- et peut être annulé viamExitToast.cancel();
juste avant l'super.onBackPressed();
appel.la source
J'ai juste pensé que je partagerais comment je l'ai fait à la fin, j'ai juste ajouté dans mon activité:
Et cela fonctionne exactement comme je le souhaite. Y compris la réinitialisation de l'état à chaque reprise de l'activité.
la source
Back
une fois puis appuyer àBack
nouveau une minute plus tard et l'application se fermera. Ce n'est pas le comportement auquel s'attend l'utilisateur.Diagramme de flux de processus:
Code Java:
la source
Il y a moyen le plus simple parmi toutes ces réponses.
Écrivez simplement le code suivant dans la
onBackPressed()
méthode.Vous devez définir l'
back_pressed
objet commelong
en activité.la source
Ma solution avec snackbar:
Simple et élégant.
la source
Sur la base de la bonne réponse et des suggestions dans les commentaires, j'ai créé une démo qui fonctionne parfaitement et supprime les rappels du gestionnaire après avoir été utilisé.
MainActivity.java
J'espère que ce sera utile !!
la source
onBackPressed()
résoudre le problème de fuite de mémoire ?Déclarer une variable
private boolean doubleBackToExitPressedOnce = false;
la source
Ce n'est pas une bonne idée d'utiliser un Runnable lorsque vous quittez l'application, j'ai récemment trouvé un moyen beaucoup plus simple d'enregistrer et de comparer la période entre deux clics sur le bouton RETOUR. Exemple de code comme suit:
Cela fera l'affaire pour quitter l'application par un double clic sur le bouton RETOUR dans un certain délai qui est de 2000 millisecondes dans l'échantillon.
la source
La réponse acceptée est la meilleure, mais si vous utilisez,
Android Design Support Library
vous pouvez utiliserSnackBar
pour de meilleures vues.la source
Ce n'est pas une fonctionnalité intégrée. Je pense que ce n'est même pas le comportement recommandé. Les applications Android ne sont pas censées quitter:
Pourquoi les applications Android ne proposent-elles pas l'option "Quitter"?
la source
Enfin, créez un onBackPressedMethod comme suit:
Cela fonctionne correctement, j'ai testé. et je pense que c'est beaucoup plus simple.
la source
La réponse de Zefnus en utilisant System.currentTimeMillis () est la meilleure (+1). La façon dont je l'ai fait n'est pas meilleure que cela, mais la publie toujours pour ajouter aux idées ci-dessus.
Si le toast n'est pas visible lorsque vous appuyez sur le bouton de retour, le toast s'affiche, tandis que s'il est visible (le dos a déjà été pressé une fois au cours de la dernière
Toast.LENGTH_SHORT
fois), il se ferme.la source
Récemment, j'ai dû implémenter cette fonction de bouton de retour dans une de mes applications. Les réponses à la question d'origine étaient utiles, mais je devais prendre en compte deux autres points:
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 support est utilisée. Si vous utilisez des fragments mais pas la bibliothèque de support, vous souhaitez remplacer
getSupportFragmentManager()
pargetFragmentManager()
.Retirez le premier
if
, si le bouton Retour n'est jamais annulé. Supprimez le secondif
, si vous n'utilisez pas de fragments ou une pile arrière de fragmentsDe plus, il est important de savoir que la méthode
onBackPressed
est prise en charge depuis Android 2.0. Consultez cette page pour une description détaillée. Pour que la fonction de contre-presse fonctionne également sur les anciennes versions, ajoutez la méthode suivante à votre activité:la source
En java
En kotlin
la source
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 ça marche bien!
la source
À cet effet, j'ai mis en œuvre la fonction suivante:
la source
Cela aide également lorsque vous avez une activité de pile précédente stockée dans la pile.
J'ai modifié la réponse de Sudheesh
la source
la source
Une méthode légèrement meilleure que Zefnus je pense. Appelez System.currentTimeMillis () une seule fois et omettez
return;
:la source
Voici le code de travail complet. Et n'oubliez pas de supprimer les rappels afin de ne pas provoquer de fuite de mémoire dans l'application. :)
la source
Ici, j'ai généralisé écrire le code pour N comptages de prises. Le code est également écrit pour l'option Activer le développeur dans le téléphone de l'appareil Android. Même vous pouvez l'utiliser pour activer les fonctionnalités pendant que le développeur teste l'application.
Appelez askToExit () sur l'option backpress ou logout.
la source
J'utilise ceci
utiliser en cas
onBackPressed
ou
ExitApp.now(this,R.string.double_back_pressed)
pour changer les secondes, besoin de millisecondes proches et spécifiées
ExitApp.now(this,R.string.double_back_pressed,5000)
la source
Lorsque HomeActivity contient un tiroir de navigation et une double fonction backPressed () pour quitter l'application. (N'oubliez pas d'initialiser la variable globale booléenne doubleBackToExitPressedOnce = false;) nouveau gestionnaire après 2 secondes, définissez la variable doubleBackPressedOnce sur false
la source
la source
Quelques améliorations dans la réponse de Sudheesh B Nair, j'ai remarqué qu'il attendra le gestionnaire même en appuyant deux fois immédiatement, donc annulez le gestionnaire comme indiqué ci-dessous. J'ai également annulé le toast pour l'empêcher de s'afficher après la sortie de l'application.
la source
C'est la même chose que la réponse acceptée et la plus votée, mais cette Snackbar coupée utilisée au lieu de Toast.
la source
Dans mon cas, je compte sur
Snackbar#isShown()
pour mieuxUX
.la source
Pour l'activité dont le tiroir de navigation est utilisé, utilisez le code suivant pour OnBackPressed ()
la source
Voici une autre façon ... d'utiliser la méthode CountDownTimer
la source