O usuário inicia meu aplicativo e faz login.
Seleciona o tempo limite da sessão como 5 minutos.
Realiza algumas operações no aplicativo. (tudo em primeiro plano)
Agora o usuário traz Myapp para segundo plano e inicia algum outro aplicativo.
----> O cronômetro de contagem regressiva é iniciado e desconecta o usuário após 5 minutos
OU o usuário DESLIGA a tela.
----> O cronômetro de contagem regressiva inicia e desconecta o usuário após 5 minutos
Desejo o mesmo comportamento mesmo quando o aplicativo está em primeiro plano, mas o usuário não interage com o aplicativo por um longo tempo, digamos de 6 a 7 minutos. Suponha que a tela esteja LIGADA o tempo todo. Desejo detectar o tipo de inatividade do usuário (sem interação com o aplicativo, embora o aplicativo esteja em primeiro plano) e iniciar meu cronômetro de contagem regressiva.
Respostas:
Eu encontrei uma solução que considero bastante simples com base na resposta de Fredrik Wallenius. Esta é uma classe de atividade básica que precisa ser estendida por todas as atividades.
fonte
Handler
eRunnable
para cadaActivity
criado. Se convertermos esses dois membros parastatic
, isso será evitado. Além disso, você poderia me dizer por que você chamoustopDisconnectTimer()
noonStop()
`?static
modificador). Quanto aoonStop()
, pelo que me lembro, chamoonBackPressed()
para retornar a uma tela de login no callback de desconexão que por sua vez chama oonStop()
método. Quando o utilizador regressa à tela de login manualmente, pressionando para trás, as necessidades de temporizador para ser interrompido, bem assim ostopDisconnectTimer()
emonStop()
. Acho que essa parte depende de suas necessidades e implementação.onBackPressed()
vas suficiente. Se você tiver mais de uma atividade em sua pilha, basta criar um intent para esse assunto. Você pode querer olhar a seguinte resposta para limpar a tarefa Activity (e evitar que os usuários se reconectem): stackoverflow.com/questions/7075349/…Não conheço uma maneira de rastrear a inatividade, mas existe uma maneira de rastrear a atividade do usuário. Você pode capturar um retorno de chamada chamado
onUserInteraction()
em suas atividades que é chamado sempre que o usuário faz qualquer interação com o aplicativo. Eu sugiro fazer algo assim:Se seu aplicativo contém várias atividades, por que não colocar esse método em uma superclasse abstrata (estendendo
Activity
) e ter todas as atividades estendendo-o.fonte
Eu acho que você deveria ir com este código, isto é para tempo limite de sessão inativa de 5 minutos: ->
fonte
isInForeGrnd ===> a lógica não é mostrada aqui, pois está fora do escopo da questão
Você pode ativar o bloqueio da CPU usando o código do dispositivo abaixo
fonte
fonte
Não existe o conceito de "inatividade do usuário" no nível do sistema operacional, além das transmissões
ACTION_SCREEN_OFF
eACTION_USER_PRESENT
. Você terá que definir "inatividade" de alguma forma em seu próprio aplicativo.fonte
Até você pode gerenciar seus requisitos com @gfrigon ou @AKh soluções.
Mas aqui está a solução gratuita de cronômetro e manipuladores para isso. Já gerenciei bem a solução Timer para isso. Mas eu implementei com sucesso a solução gratuita Timer and Handler.
Em primeiro lugar, direi o que você deve gerenciar se usar Timer ou Handlers.
Finalmente implementei uma solução que é
ACTION_SCREEN_ON
/ACTION_SCREEN_OFF
Receptor de transmissão.Solução confiável mais fácil
Não observaremos a inatividade do usuário por temporizadores, em vez de verificar o tempo da última atividade na atividade do usuário. Então, quando o usuário interagir com o aplicativo da próxima vez, eu verifico o tempo da última interação.
Aqui está o
BaseActivity.class
que você estenderá de todas as suas classes de atividades ao invés deLoginActivity
. Você definirá seu tempo de logout no campoTIMEOUT_IN_MILLI
nesta aula.fonte
Na minha classe base de atividades, criei uma classe protegida:
Portanto, no método onResume - você pode especificar a ação em seu retorno de chamada o que deseja fazer com ela ...
fonte
Durante a minha pesquisa encontrei muitas respostas, mas esta é a melhor resposta que recebi. Mas a limitação desse código é que ele funciona apenas para atividades, não para o aplicativo inteiro. Tome isso como referência.
por exemplo, você usou 8000, a tarefa será realizada após 8 segundos de inatividade do usuário.
fonte
A inatividade do usuário pode detectar usando o
onUserInteraction()
método de substituição no AndroidAqui está o código de amostra, sair (HomeActivity -> LoginActivity) após 3 minutos quando o usuário inativo
fonte
Lidando com o usuário em tempo limite de interação em KOTLIN:
fonte
Aqui está uma solução completa que lida com a inatividade do usuário após alguns minutos (por exemplo, 3 minutos). Isso resolve os problemas comuns, como a atividade saltando para o primeiro plano quando o aplicativo está em segundo plano após o tempo limite.
Em primeiro lugar, criamos uma BaseActivity que todas as outras Activity podem estender.
Este é o código BaseActivity.
A seguir, criamos uma interface para nosso "Logout Listener"
Finalmente, criamos uma classe Java que estende "Application"
Observação: não se esqueça de adicionar a classe "TimeOutApp" à tag do seu aplicativo dentro do arquivo de manifesto
fonte
Acho que precisa ser combinando o cronômetro com o tempo da última atividade.
Assim:
Em onCreate (Bundle savedInstanceState) inicie um cronômetro, digamos 5 minutos
Em onUserInteraction () apenas armazene a hora atual
Muito simples até agora.
Agora, quando o cronômetro estourar, faça assim:
fonte
Eu tive uma situação semelhante à questão do SO, onde eu precisava rastrear a inatividade do usuário por 1 minuto e, em seguida, redirecionar o usuário para iniciar a atividade, eu precisava também limpar a pilha de atividades.
Com base na resposta de @gfrigon, proponho esta solução.
ActionBar.java
Recursos complementares
Android: Limpar pilha de atividades
Esta classe Handler deve ser estática ou podem ocorrer vazamentos
fonte
A melhor coisa é lidar com isso em todo o aplicativo (supondo que você tenha várias atividades), registrando-se
AppLifecycleCallbacks
nos calss do aplicativo. Você pode usarregisterActivityLifecycleCallbacks()
na classe Application com os seguintes retornos de chamada (eu recomendo criar uma classe AppLifecycleCallbacks que estenda ActivityLifecycleCallbacks):fonte
Estenda sua atividade com
para obter a MainActivity quando o usuário está inativo após 3.000 milissegundos em YourActivity
Usei uma resposta anterior e a converti para kotlin.
fonte