Quando o botão VOLTAR é pressionado no telefone, desejo impedir que uma atividade específica retorne à anterior.
Especificamente, tenho telas de login e inscrição, ambas iniciam uma nova atividade chamada HomeScreen
quando ocorre um login / inscrição bem-sucedida. Depois que o HomeScreen for iniciado, desejo impedir que os usuários possam retornar às telas de login ou inscrição pressionando a tecla VOLTAR.
Tentei usar Intent.FLAG_ACTIVITY_NO_HISTORY
, mas como o aplicativo tem integração com o Facebook, quando o 'Login with Facebook' é usado, o Facebook deve retornar à tela de login inicial, portanto, devo manter um histórico dessas atividades.
Pensei em substituir o comportamento do botão VOLTAR HomeScreen
para finalizar diretamente um aplicativo quando o botão é pressionado e usei
@Override
public void onBackPressed() {
finish();
}
mas isso também não funciona.
Respostas:
Minha sugestão seria concluir a atividade que você não deseja que os usuários voltem. Por exemplo, em sua atividade de login, logo após ligar
startActivity
, liguefinish()
. Quando os usuários pressionam o botão Voltar, eles não poderão acessar a atividade de logon porque ela foi eliminada da pilha.fonte
finish
durante uma transição compartilhada, poderá sofrer um sangramento com a atividade anterior. por exemplo, se você tiverHomeActivity
->IntermediateActivity
->FinalActivity
, e você chamarfinish()
naIntermediateActivity
imediatamente após o início doFinalActivity
que você vai ver oHomeActivity
por um momento breve.A solução a seguir pode ser bastante útil no cenário usual de login / atividade principal ou na implementação de uma tela de bloqueio.
Para minimizar o aplicativo em vez de voltar à atividade anterior, você pode substituir
onBackPressed()
assim:moveTaskToBack(boolean nonRoot)
deixa sua pilha de trás como está, apenas coloca sua tarefa (todas as atividades) em segundo plano. O mesmo que se o usuário tivesse pressionado o botão Início .Parâmetro
boolean nonRoot
- Se falso, isso funcionará apenas se a atividade for a raiz de uma tarefa; se for verdade, funcionará para qualquer atividade em uma tarefa.fonte
Não sei exatamente o que você deseja, mas parece que deve ser possível e também parece que você já está no caminho certo.
Aqui estão alguns links que podem ajudar:
Desativar botão voltar no android
Como posso desativar 'voltar' a alguma atividade?
fonte
System.exit(0)
é chamado (eu sei que não é o melhor em prática, mas eu só queria dar um exemplo).Existem duas soluções para o seu caso, a atividade A inicia a atividade B, mas você não deseja voltar à atividade A na atividade B.
1. Removida a atividade anterior A da pilha traseira.
2. Desativado, ação do botão voltar na atividade B.
Existem duas maneiras de impedir o evento voltar atrás, como abaixo,
1) Recomendar abordagem
2) Substituir método onKeyDown
Espero que seja útil, mas ainda depende das suas situações.
fonte
finish()
. Excessivamente desnecessário comnohistory
atributo, sinalizadores de intenção, tags de manifesto de atividade pai, etc! Bobo, obrigado pela resposta!Como já existem muitas ótimas soluções sugeridas, tentarei dar uma explicação mais difusa.
Remova a atividade anterior do Backstack. Simples
finish()
Método de chamadaO fluxo normal:
Todas as atividades são armazenadas em uma pilha conhecida como Backstack.
Quando você inicia uma nova atividade (
startActivity(...)
), a nova atividade é empurrada para o topo da pilha e, quando você pressiona o botão Voltar, a atividade é exibida na pilha.Um ponto importante a ser observado é que, quando o botão Voltar é pressionado, o
finish();
método é chamado internamente. Esse é o comportamento padrão do método onBackPressed ().Então, se você quiser pular a Atividade B?
Basta adicionar o
finish();
método após o seustartActvity(...)
na Atividade Bfonte
finish()
fornece o método para fechar o aplicativo atual da atividade, não todo. E é melhor você não tentar procurar métodos para matar aplicativos. Um pequeno conselho.Você já tentou a conjunção de
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
? Lembre-se de usar esses sinalizadores naIntent
atividade inicial!fonte
FLAG_ACTIVITY_NO_HISTORY
impede que o meu LoginScreen capture o retorno de chamada do Facebook quando o Login com o Facebook é usado. Como o foco sai da tela de login, ele não pode ser retomado (pois não há histórico). Mas ainda não experimenteiIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
, vou verificar, obrigado!finish()
método, eu não sabia sobre isso.Coloque
finish()
logo depoisfonte
A resposta de paulsm4 é a correta. Se
onBackPressed()
você voltar, desabilitará o botão Voltar. No entanto, acho que uma abordagem melhor, dado o seu caso de uso, é inverter a lógica da atividade, ou seja, tornar a atividade em casa a principal, verificar se o usuário está conectado lá ou, se não, iniciar a atividade de entrada. O motivo é que, se você substituir o botão Voltar em sua atividade principal, a maioria dos usuários ficará confusa ao pressionar novamente e seu aplicativo não fará nada.fonte
Se você não quiser voltar para todas as atividades em seu aplicativo, poderá usar
Saiba mais aqui: http://developer.android.com/guide/topics/manifest/activity-element.html
fonte
Este método está funcionando bem
fonte
Basta substituir o método onKeyDown e verificar se o botão Voltar foi pressionado.
fonte
Quando você cria,
onBackPressed()
basta removersuper.onBackPressed();
e isso deve funcionarfonte
Colocar
imediatamente após o ActivityStart para interromper a atividade, impedindo qualquer maneira de voltar a ela. Então adicione
para a atividade que você está iniciando.
fonte