El usuario inicia mi aplicación e inicia sesión.
Selecciona el tiempo de espera de la sesión en 5 minutos.
Realiza algunas operaciones en la aplicación. (todo en primer plano)
Ahora el usuario lleva Myapp a segundo plano e inicia alguna otra aplicación.
----> El temporizador de cuenta regresiva comienza y cierra la sesión del usuario después de 5 minutos
O el usuario apaga la pantalla.
----> El temporizador de cuenta regresiva comienza y cierra la sesión del usuario después de 5 minutos
Quiero el mismo comportamiento incluso cuando la aplicación está en primer plano, pero el usuario no interactúa con la aplicación durante mucho tiempo, digamos 6-7 minutos. Suponga que la pantalla está encendida todo el tiempo. Quiero detectar el tipo de inactividad del usuario (sin interacción con la aplicación aunque la aplicación esté en primer plano) y poner en marcha mi temporizador de cuenta atrás.
Respuestas:
Se me ocurrió una solución que encuentro bastante simple basada en la respuesta de Fredrik Wallenius. Esta es una clase de actividad básica que debe ampliarse a todas las actividades.
fuente
Handler
yRunnable
para cadaActivity
creado. Si convertimos estos dos miembros astatic
, esto se evitará. Además, ¿podría decirme por qué has llamadostopDisconnectTimer()
deonStop()
`?static
modificador). En cuanto aonStop()
, por lo que recuerdo, llamoonBackPressed()
para volver a una pantalla de inicio de sesión en la devolución de llamada de desconexión que a su vez llama alonStop()
método. Cuando el usuario regresa a la pantalla de inicio de sesión manualmente, presionando Atrás, el temporizador debe detenerse y, por lo tanto, elstopDisconnectTimer()
inonStop()
. Supongo que esta parte depende de sus necesidades e implementación.onBackPressed()
vas suficiente. Si tiene más de una actividad en su pila, solo tiene que crear una intención para ese asunto. Es posible que desee ver la siguiente respuesta para borrar la tarea Actividad (y evitar que los usuarios se vuelvan a conectar en la parte posterior): stackoverflow.com/questions/7075349/…No conozco una forma de rastrear la inactividad, pero hay una manera de rastrear la actividad del usuario. Puede recibir una devolución de llamada llamada
onUserInteraction()
en sus actividades que se llama cada vez que el usuario interactúa con la aplicación. Sugeriría hacer algo como esto:Si su aplicación contiene varias actividades, ¿por qué no poner este método en una superclase abstracta (extensión
Activity
) y luego hacer que todas sus actividades la extiendan?fuente
Creo que debería seguir este código, esto es para un tiempo de espera de sesión inactivo de 5 minutos: ->
fuente
isInForeGrnd ===> la lógica no se muestra aquí ya que está fuera del alcance de la pregunta
Puede activar el bloqueo de la CPU mediante el código de dispositivo a continuación:
fuente
fuente
No existe el concepto de "inactividad del usuario" a nivel del sistema operativo, más allá de las transmisiones
ACTION_SCREEN_OFF
yACTION_USER_PRESENT
. Tendrá que definir "inactividad" de alguna manera dentro de su propia aplicación.fuente
Incluso puede gestionar sus necesidades con @gfrigon o @AKh soluciones .
Pero aquí hay una solución gratuita de Timer and Handlers para esto. Ya tengo una solución de temporizador bien administrada para esto. Pero he implementado con éxito la solución gratuita Timer and Handler.
Primero te cuento lo que tienes que gestionar si usas Timer o Handlers.
Finalmente implementé una solución que es
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
Receptor de difusión.La solución confiable más fácil
No observaremos la inactividad del usuario por temporizadores en lugar de verificar el tiempo de la última actividad en la actividad del usuario. Entonces, cuando el usuario interactúe con la aplicación la próxima vez, verifico el tiempo de la última interacción.
Aquí es
BaseActivity.class
lo que extenderá de cada una de sus clases de actividades en lugar deLoginActivity
. Definirá su tiempo de cierre de sesión en el campoTIMEOUT_IN_MILLI
de esta clase.fuente
En mi clase base de actividad creé una clase protegida:
Entonces, en el método onResume , puede especificar la acción en su devolución de llamada qué desea hacer con ella ...
fuente
Durante mi búsqueda encontré muchas respuestas, pero esta es la mejor respuesta que obtuve. Pero la limitación de este código es que funciona solo para la actividad, no para toda la aplicación. Toma esto como referencia.
por ejemplo, usó 8000, la tarea se realizará después de 8 segundos de inactividad del usuario.
fuente
La inactividad del usuario puede detectar usando el
onUserInteraction()
método de anulación en AndroidAquí está el código de muestra, cierre la sesión (HomeActivity -> LoginActivity) después de 3 minutos cuando el usuario está inactivo
fuente
Manejo de usuario en tiempo de espera de interacción en KOTLIN:
fuente
Aquí hay una solución completa que maneja la inactividad del usuario después de unos minutos (por ejemplo, 3 minutos). Esto resuelve los problemas comunes, como que la actividad salte al primer plano cuando la aplicación está en segundo plano cuando se agota el tiempo de espera.
En primer lugar, creamos una BaseActivity que todas las demás actividades pueden ampliar.
Este es el código BaseActivity.
A continuación, creamos una interfaz para nuestro "Logout Listener"
Finalmente, creamos una clase Java que extiende "Aplicación"
Nota: No olvide agregar la clase "TimeOutApp" a la etiqueta de su aplicación dentro de su archivo de manifiesto.
fuente
Creo que debe ser combinando el temporizador con el último tiempo de actividad.
Así que así:
En onCreate (Bundle SavedInstanceState) inicie un temporizador, digamos 5 minutos
En onUserInteraction () solo almacena la hora actual
Bastante simple hasta ahora.
Ahora, cuando el temporizador suene, haz lo siguiente:
fuente
Tuve una situación similar a la pregunta SO, donde necesitaba rastrear la inactividad del usuario durante 1 minuto y luego redirigir al usuario para que inicie la Actividad, también necesitaba borrar la pila de actividades.
Basado en la respuesta de @gfrigon, se me ocurre esta solución.
ActionBar.java
Recursos complementarios
Android: Borrar pila de actividades
Esta clase de controlador debe ser estática o podrían producirse fugas
fuente
Lo mejor es manejar esto en toda su aplicación (suponiendo que tenga varias actividades) registrándose
AppLifecycleCallbacks
en la aplicación Calss. Puede usarregisterActivityLifecycleCallbacks()
en la clase Application con las siguientes devoluciones de llamada (recomiendo crear una clase AppLifecycleCallbacks que amplíe ActivityLifecycleCallbacks):fuente
Amplíe su actividad con
para llegar a MainActivity cuando el usuario está inactivo después de 3000 milisegundos en YourActivity
Usé una respuesta anterior y la convertí a kotlin.
fuente