Eu notei esse padrão em muitos aplicativos e jogos Android recentemente: ao clicar no botão voltar para "sair" do aplicativo, Toast
surge uma mensagem semelhante a "Por favor, clique em VOLTAR novamente para sair".
Fiquei me perguntando, como eu o vejo cada vez mais frequentemente, esse é um recurso interno que você pode acessar de alguma forma em uma atividade? Eu olhei o código fonte de muitas classes, mas não consigo encontrar nada sobre isso.
Obviamente, posso pensar em algumas maneiras de obter a mesma funcionalidade com bastante facilidade (o mais fácil é provavelmente manter um booleano na atividade que indica se o usuário já clicou uma vez ...), mas eu queria saber se já existe algo aqui. .
EDIT : Como o @LAS_VEGAS mencionou, eu realmente não quis dizer "saída" no significado tradicional. (ou seja, encerrado), eu quis dizer "voltando ao que estava aberto antes do lançamento da atividade de início do aplicativo", se isso faz sentido :)
fonte
Respostas:
Acho que esse manipulador ajuda a redefinir a variável após 2 segundos.
fonte
Sudheesh B Nair
para cobrir os comentários sugeridos acima.Sudheesh B Nair tem uma resposta legal (e aceita) sobre a pergunta, que eu acho que deveria ter uma alternativa melhor como;
O que há de errado em medir o tempo passado e verificar se os
TIME_INTERVAL
milissegundos (por exemplo, 2000) passaram desde a última pressão de retorno. O seguinte código de exemplo usaSystem.currentTimeMillis();
para armazenar a hora em queonBackPressed()
é chamada;De volta à crítica de resposta aceita ; Usar a
flag
para indicar se ele foi pressionado nos últimosTIME_INTERVAL
milisegundos (por exemplo, 2000) e o método set-reset is via foi a primeira coisa que me veio à mente. Mas a ação deve ser cancelada quando a atividade estiver sendo fechada, removendo o .Handler
postDelayed()
postDelayed()
Runnable
Para remover o
Runnable
, ele não deve ser declarado anônimo e ser declarado como membro junto com oHandler
também. Então oremoveCallbacks()
método deHandler
pode ser chamado apropriadamente.A amostra a seguir é a demonstração;
Agradecemos a @NSouth por contribuir; Para impedir que a mensagem do brinde apareça mesmo após o fechamento do aplicativo,
Toast
pode ser declarada como membro - por exemplomExitToast
- e pode ser cancelada viamExitToast.cancel();
pouco antes dasuper.onBackPressed();
chamada.fonte
Apenas pensei em compartilhar como fiz no final, acabei de adicionar minha atividade:
E funciona exatamente como eu quero. Incluindo a redefinição do estado sempre que a atividade é retomada.
fonte
Back
uma vez e pressionarBack
novamente um minuto depois, e o aplicativo será encerrado. Este não é o comportamento que o usuário esperará.Diagrama de fluxo de processo:
Código Java:
fonte
Existe uma maneira muito mais simples entre todas essas respostas.
Basta escrever o seguinte código dentro do
onBackPressed()
método.Você precisa definir um
back_pressed
objeto comolong
em atividade.fonte
Minha solução usando snackbar:
Simples e elegante.
fonte
Com base nas respostas e sugestões corretas nos comentários, criei uma demonstração que funciona absolutamente bem e remove os retornos de chamada do manipulador após serem utilizados.
MainActivity.java
Espero que seja útil !!
fonte
onBackPressed()
correção do problema de vazamento de memória ?Declarar variável
private boolean doubleBackToExitPressedOnce = false;
fonte
Não é uma boa idéia usar um Runnable ao sair do aplicativo. Recentemente, descobri uma maneira muito mais simples de registrar e comparar o período entre dois cliques no botão VOLTAR. Código de exemplo da seguinte maneira:
Isso fará o truque para sair do aplicativo clicando duas vezes no botão VOLTAR dentro de um certo período de atraso que é de 2000 milissegundos na amostra.
fonte
A resposta aceita é a melhor, mas se você estiver usando
Android Design Support Library
, poderá usarSnackBar
para melhores visualizações.fonte
Não é uma funcionalidade incorporada. Eu acho que nem é o comportamento recomendado. Os aplicativos Android não devem sair:
Por que os aplicativos Android não oferecem a opção "Sair"?
fonte
Por fim, crie um onBackPressedMethod da seguinte maneira:
Isso funciona corretamente, eu testei. e acho que isso é muito mais simples.
fonte
A resposta de Zefnus usando System.currentTimeMillis () é a melhor (+1). O jeito que eu fiz isso não é melhor do que isso, mas ainda estou postando para adicionar às idéias acima.
Se a torrada não estiver visível quando o botão Voltar for pressionado, a torrada será exibida, enquanto, se estiver visível (a parte traseira já foi pressionada uma vez na última
Toast.LENGTH_SHORT
vez), ela será encerrada.fonte
Recentemente, eu precisava implementar esse recurso de botão voltar em um aplicativo meu. As respostas da pergunta original foram úteis, mas eu tive que levar mais dois pontos em consideração:
Com base nas respostas e comentários, criei o seguinte código:
O código acima supõe que a biblioteca de suporte seja usada. Se você usa fragmentos, mas não a biblioteca de suporte, deseja substituir
getSupportFragmentManager()
porgetFragmentManager()
.Remova a primeira
if
, se o botão de volta nunca é cancelada. Remova o segundoif
, se você não usar fragmentos ou uma pilha traseira de fragmentosAlém disso, é importante estar ciente de que o método
onBackPressed
é suportado desde o Android 2.0. Verifique esta página para uma descrição elaborada. Para que o recurso de contrapressão também funcione em versões mais antigas, adicione o seguinte método à sua atividade:fonte
Em java
No kotlin
fonte
Sei que essa é uma pergunta muito antiga, mas é a maneira mais fácil de fazer o que você deseja.
Sei que esse não é o melhor método, mas funciona bem!
fonte
Para esse fim, implementei a seguinte função:
fonte
Isso também ajuda quando você tem uma atividade anterior da pilha armazenada na pilha.
Modifiquei a resposta de Sudheesh
fonte
fonte
Um método um pouco melhor que o Zefnus, eu acho. Chame System.currentTimeMillis () apenas uma vez e omita
return;
:fonte
Aqui está o código completo de trabalho. E também não se esqueça de remover os retornos de chamada para que não causem vazamento de memória no aplicativo. :)
fonte
Aqui, generalizei o código para N contagens de toques. O código é escrito da mesma forma para a opção Ativar desenvolvedor no telefone do dispositivo Android. Até você pode usar isso para ativar os recursos enquanto o desenvolvedor testa o aplicativo.
Chame askToExit () na opção backpress ou logout.
fonte
Eu uso isso
use para no evento
onBackPressed
ou
ExitApp.now(this,R.string.double_back_pressed)
para que os segundos de mudança precisem de milissegundos próximos e especificados
ExitApp.now(this,R.string.double_back_pressed,5000)
fonte
Quando o HomeActivity contém gaveta de navegação e função backPressed () dupla para sair do aplicativo. (Não esqueça de iniciar a variável global booleana doubleBackToExitPressedOnce = false;) novo manipulador após 2 s defina a variável doubleBackPressedOnce como false
fonte
fonte
Algumas melhorias na resposta de Sudheesh B Nair, notei que ele aguardará o manipulador, mesmo pressionando duas vezes imediatamente imediatamente, então cancele o manipulador conforme mostrado abaixo. Cancled torradas também para impedir que seja exibido após a saída do aplicativo.
fonte
É o mesmo da resposta aceita e mais votada, mas isso recortou o Snackbar usado em vez do Toast.
fonte
No meu caso, eu dependo
Snackbar#isShown()
para melhorUX
.fonte
Para a atividade que possui a Gaveta de Navegação , use o código a seguir para OnBackPressed ()
fonte
Aqui está outra maneira ... usando o método CountDownTimer
fonte