Isso tem me deixado maluco por um tempo.
Existe alguma maneira de detectar com segurança se o botão home foi pressionado em um aplicativo Android?
Caso contrário, existe uma maneira robusta de dizer o que fez com que uma atividade entrasse na pausa? Ou seja, podemos detectar se foi causado pelo início de uma nova atividade ou pressionando voltar / home.
Uma sugestão que vi é substituir onPause () e chamar isFinishing (), mas isso retornará falso ao pressionar o botão home, assim como faria se uma nova atividade estivesse sendo iniciada, portanto, não consegue distinguir entre os dois.
Qualquer ajuda muito apreciada.
** Atualização **: Obrigado @ android -gry por este link: https://nishandroid.blogspot.com/
Substituindo o seguinte método:
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
}
Em seguida, o seguinte evento SERÁ disparado ao pressionar o botão home:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_HOME)
{
//The Code Want to Perform.
}
});
Não tenho certeza se há efeitos colaterais com esta linha:
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
Portanto, ao contrário da crença popular, parece que você pode ouvir a tecla home. É preocupante que você retorne false e a chave home não faça nada.
Atualização : Como esperado, existem alguns efeitos colaterais com isso - parece que os vídeos incorporados e mapas do Google não são visíveis com este modo habilitado.
Atualização : supostamente, este hack não funciona mais a partir do Android 4.0
fonte
Activity.onUserLeaveHint()
.Respostas:
O código a seguir funciona para mim :)
fonte
onHomeLongPressed
realmente parece corresponder à abertura da atividade do sistema "Recentes". No meu telefone, isso é acionado pressionando o botão Recentes ao lado do botão home, de modo que a suposição do seu código sobre ser um pressionamento longo doméstico nem sempre é correta.final String SYSTEM_DIALOG_REASON_LONG_PRESS = "assist"
Esta é uma pergunta antiga, mas pode ajudar alguém.
De acordo com a documentação, o método onUserLeaveHint () é chamado quando o usuário clica no botão home OU quando algo interrompe seu aplicativo (como uma chamada telefônica).
Isso funciona para mim .. :)
fonte
É impossível detectar e / ou interceptar o botão HOME de um aplicativo Android. Isso é integrado ao sistema para evitar aplicativos maliciosos que não podem ser encerrados.
fonte
Eu precisava iniciar / parar a música de fundo em meu aplicativo quando a primeira atividade abre e fecha ou quando qualquer atividade é pausada pelo botão de início e, em seguida, retomada do gerenciador de tarefas. A reprodução pura parando / retomando
Activity.onPause()
eActivity.onResume()
interrompendo a música por um tempo, então eu tive que escrever o seguinte código:que interrompe a reprodução apenas quando o aplicativo (todas as suas atividades) é fechado ou quando o botão home é pressionado. Infelizmente não consegui mudar a ordem das chamadas do
onPause()
método da atividade inicial eonResume()
da atividade iniciada quandoActivity.startActivity()
é chamada (ou detectaonPause()
que essa atividade está iniciando outra atividade de outra forma) então este caso tem que ser tratado de maneira especial:Outra desvantagem é que isso requer
GET_TASKS
permissão adicionada paraAndroidManifest.xml
:Modificar esse código para que ele reaja apenas ao pressionar o botão home é direto.
fonte
Substituir
onUserLeaveHint()
na atividade. Nunca haverá nenhum retorno de chamada para a atividade quando uma nova atividade ocorrer ou o usuário pressionar a tecla de retorno.fonte
onUserLeaveHint ();
substituir este método de classe de atividade. Isso detectará o clique da tecla home. Este método é chamado imediatamente antes do retorno de chamada onPause () da atividade. Mas ele não será chamado quando uma atividade for interrompida como uma atividade em chamada vem para o primeiro plano, além das interrupções que ele chamará quando o usuário clicar na tecla home.
fonte
Tente criar um contador para cada tela. Se o usuário tocar em INÍCIO, o contador será zero.
fonte
Você pode considerar uma solução de Andreas Shrade em seu post sobre Como criar um modo quiosque funcional no Android . É um pouco hacky, mas devido aos motivos pelos quais a interceptação do botão home é impedida, tem que ser;)
fonte
Eu tive esse problema, e como a substituição do método onKeyDown () não resultou em nada porque o sistema Android subjacente não chamou esse método, resolvi isso substituindo onBackPressed () e tinha um valor booleano definido como falso , porque pressionei de volta, deixe-me mostrar o que quero dizer com código:
Então, isso funcionou porque a única maneira de navegar fora desta atividade é pressionando voltar ou home, então, se voltar, então eu sei que a causa não era home, mas caso contrário, a causa era home, portanto, defino o booleano padrão valor para homePressed ser verdadeiro. No entanto, isso só funcionará com uma única instância de atividade em seu aplicativo, caso contrário, você terá mais possibilidades de fazer com que o método onPause () seja chamado.
fonte
homePressed
como verdadeiro e, em seguida, alternar para outro aplicativo pensaria que Home foi pressionado quando na verdade não estava.Desde a API 14, você pode usar a função
onTrimMemory()
e verificar o sinalizadorTRIM_MEMORY_UI_HIDDEN
. Isso informará que seu aplicativo ficará em segundo plano.Portanto, em sua classe de aplicativo personalizada, você pode escrever algo como:
Para um estudo aprofundado sobre isso, convido você a ler este artigo: http://www.developerphil.com/no-you-can-not-override-the-home-button-but-you-dont-have -para/
fonte
Uma opção para seu aplicativo seria escrever uma tela inicial de substituição usando o intent android.intent.category.HOME. Acredito que neste tipo de Intent você possa ver o botão home.
Mais detalhes:
http://developer.android.com/guide/topics/intents/intents-filters.html#imatch
fonte
Como você deseja apenas que a atividade raiz seja mostrada novamente quando o aplicativo for iniciado, talvez você possa obter esse comportamento alterando os modos de inicialização etc.
Por exemplo, você já tentou aplicar o atributo android: clearTaskOnLaunch = "true" à sua atividade de inicialização, talvez em conjunto com android: launchMode = "singleInstance" ?
Tarefas e pilha de retorno são um ótimo recurso para ajustar esse tipo de comportamento.
fonte
É uma má ideia alterar o comportamento da tecla home. É por isso que o Google não permite que você substitua a chave home. Eu não mexeria com a chave de casa em geral. Você precisa dar ao usuário uma maneira de sair do seu aplicativo se ele se perder por qualquer motivo.
Imagino que qualquer solução alternativa terá efeitos colaterais indesejados.
fonte
Recentemente, estava tentando detectar o botão home, porque precisava que ele fizesse o mesmo que o método " onBackPressed () ". Para fazer isso, tive que substituir o método " onSupportNavigateUp () " assim:
Funcionou perfeitamente. =)
fonte
A resposta de Jack está funcionando perfeitamente para o
click
evento enquantolongClick
está considerando é ummenu
clique de botão.A propósito, se alguém está se perguntando como fazer via kotlin,
fonte
Android Home Key tratada pela camada de estrutura, você não pode lidar com isso no nível da camada de aplicativo. Porque a ação do botão home já está definida no nível inferior. Mas se você estiver desenvolvendo sua ROM personalizada, talvez seja possível. O Google restringiu as funções de substituição do BOTÃO INICIAL por motivos de segurança.
fonte
Isso funciona para mim. Você pode substituir o método onUserLeaveHint https://www.tutorialspoint.com/detect-home-button-press-in-android
fonte