Recientemente noté este patrón en muchas aplicaciones y juegos de Android: al hacer clic en el botón Atrás para "salir" de la aplicación, Toast
aparece un mensaje similar a "Haga clic en ATRÁS nuevamente para salir".
Me preguntaba, como lo veo cada vez más a menudo, ¿es esa una característica incorporada a la que puedes acceder de alguna manera en una actividad? He mirado el código fuente de muchas clases pero parece que no puedo encontrar nada al respecto.
Por supuesto, puedo pensar en algunas maneras de lograr la misma funcionalidad con bastante facilidad (la más fácil es mantener un valor booleano en la actividad que indica si el usuario ya hizo clic una vez ...) pero me preguntaba si ya hay algo aquí. .
EDITAR : Como @LAS_VEGAS mencionó, realmente no quise decir "salir" en el significado tradicional. (es decir, terminado) quise decir "volver a lo que estaba abierto antes de que se iniciara la actividad de inicio de la aplicación", si eso tiene sentido :)
fuente
Respuestas:
Creo que este controlador ayuda a restablecer la variable después de 2 segundos.
fuente
Sudheesh B Nair
para cubrir los comentarios sugeridos anteriormente.Sudheesh B Nair tiene una respuesta agradable (y aceptada) sobre la pregunta, que creo que debería tener una mejor alternativa como;
¿Qué hay de malo en medir el tiempo transcurrido y verificar si
TIME_INTERVAL
pasaron milisegundos (por ejemplo, 2000) desde la última vez que presionó hacia atrás? Se llama al siguiente código de muestraSystem.currentTimeMillis();
para almacenar el tiempoonBackPressed()
;Volver a la respuesta aceptada crítica ; El uso de a
flag
para indicar si se presionó en los últimosTIME_INTERVAL
milisegundos (por ejemplo, 2000) y se estableció el restablecimiento medianteHandler
elpostDelayed()
método fue lo primero que se me ocurrió. Pero lapostDelayed()
acción debe cancelarse cuando se cierra la actividad, eliminando elRunnable
.Para eliminarlo
Runnable
, no debe declararse anónimo , y debe declararse como miembro junto con elHandler
también. EntoncesremoveCallbacks()
método deHandler
puede ser llamado apropiadamente.La siguiente muestra es la demostración;
Gracias a @NSouth por contribuir; Para evitar que aparezcan mensajes de brindis incluso después de cerrar la aplicación,
Toast
puede declararse como miembro, digamosmExitToast
, y puede cancelarsemExitToast.cancel();
justo antes de lasuper.onBackPressed();
llamada.fuente
Solo pensé en compartir cómo lo hice al final, agregué en mi actividad:
Y simplemente funciona exactamente como quiero. Incluyendo el restablecimiento del estado cada vez que se reanuda la actividad.
fuente
Back
una vez y luego presionarBack
nuevamente un minuto después y la aplicación se cerrará. Este no es el comportamiento que el usuario esperará.Diagrama de flujo del proceso:
Código Java:
fuente
Hay una manera muy simple entre todas estas respuestas.
Simplemente escriba el siguiente código dentro del
onBackPressed()
método.Necesita definir el
back_pressed
objeto comolong
en la actividad.fuente
Mi solución usando snackbar:
Simple y con estilo.
fuente
Basado en la respuesta correcta y las sugerencias en los comentarios, he creado una demostración que funciona absolutamente bien y elimina las devoluciones de llamada del controlador después de ser utilizado.
MainActivity.java
Espero que sea util !!
fuente
onBackPressed()
solucionar el problema de pérdida de memoria ?Declarar variable
private boolean doubleBackToExitPressedOnce = false;
fuente
No es una buena idea usar un Runnable al salir de la aplicación, recientemente descubrí una forma mucho más simple de registrar y comparar el período entre dos clics en el botón ATRÁS. Código de muestra de la siguiente manera:
Esto hará el truco para salir de la aplicación haciendo doble clic en el botón ATRÁS dentro de un cierto período de retraso que es de 2000 milisegundos en la muestra.
fuente
La respuesta aceptada es la mejor, pero si está usando
Android Design Support Library
, puede usarSnackBar
para obtener mejores vistas.fuente
No es una funcionalidad incorporada. Creo que ni siquiera es el comportamiento recomendado. Las aplicaciones de Android no están destinadas a salir:
¿Por qué las aplicaciones de Android no ofrecen la opción "Salir"?
fuente
Finalmente, cree un método onBackPressed como sigue:
Esto funciona correctamente, lo he probado. Y creo que esto es mucho más simple.
fuente
La respuesta de Zefnus usando System.currentTimeMillis () es la mejor (+1). La forma en que lo hice es no mejor que eso, pero todavía publicarla en añadir a las ideas anteriores.
Si la tostada no es visible cuando se presiona el botón de retroceso, se muestra la tostada, mientras que si está visible (la última
Toast.LENGTH_SHORT
vez que se presionó la última vez), se cierra.fuente
Recientemente, necesitaba implementar esta función de botón de retroceso en una aplicación mía. Las respuestas a la pregunta original fueron útiles, pero tuve que tener en cuenta dos puntos más:
Basado en las respuestas y comentarios, creé el siguiente código:
El código anterior supone que se utiliza la biblioteca de soporte. Si usa fragmentos pero no la biblioteca de soporte, desea reemplazarlos
getSupportFragmentManager()
porgetFragmentManager()
.Elimine el primero
if
, si el botón Atrás nunca se cancela. Quitar el segundoif
, si no usa fragmentos o una pila de fragmentosAdemás, es importante tener en cuenta que el método
onBackPressed
es compatible desde Android 2.0. Consulte esta página para obtener una descripción detallada. Para hacer que la función de retroceso funcione también en versiones anteriores, agregue el siguiente método a su actividad:fuente
En java
En kotlin
fuente
Sé que esta es una pregunta muy antigua, pero esta es la forma más fácil de hacer lo que quieres.
Sé que este no es el mejor método, ¡pero funciona bien!
fuente
Para este propósito he implementado la siguiente función:
fuente
Esto también ayuda cuando tiene actividad de pila anterior almacenada en la pila.
He modificado la respuesta de Sudheesh
fuente
fuente
Un método un poco mejor que Zefnus , creo. Llame a System.currentTimeMillis () solo una vez y omita
return;
:fuente
Aquí está el código de trabajo completo. Y tampoco olvide eliminar las devoluciones de llamada para que no se pierda memoria en la aplicación. :)
fuente
Aquí, he generalizado escribir el código para N recuentos de tomas. El código está escrito de manera similar para la opción Habilitar desarrollador en el teléfono del dispositivo Android. Incluso puede usar esto para habilitar funciones mientras el desarrollador prueba la aplicación.
Llame a askToExit () en la opción de retroceso o cierre de sesión.
fuente
yo uso esto
utilizar en caso
onBackPressed
o
ExitApp.now(this,R.string.double_back_pressed)
para cambiar los segundos es necesario cerrar, milisegundos especificados
ExitApp.now(this,R.string.double_back_pressed,5000)
fuente
Cuando HomeActivity contiene el cajón de navegación y la función doble BackPressed () para salir de la aplicación. (No olvide iniciar la variable global booleana doubleBackToExitPressedOnce = false;) nuevo controlador después de 2 segundos establezca la variable doubleBackPressedOnce en false
fuente
fuente
Algunas mejoras en la respuesta de Sudheesh B Nair, he notado que esperará al controlador incluso mientras presiona hacia atrás dos veces inmediatamente, así que cancele el controlador como se muestra a continuación. También he preparado tostadas para evitar que se muestre después de salir de la aplicación.
fuente
Esta es la misma respuesta aceptada y más votada, pero esta recortada usó Snackbar en lugar de Toast.
fuente
En mi caso, he dependido
Snackbar#isShown()
para mejorarUX
.fuente
Para la actividad que tiene Navigation Drawer , use el siguiente código para OnBackPressed ()
fuente
Aquí hay otra forma ... usando el método CountDownTimer
fuente