Android: volte para a atividade anterior

525

Eu quero fazer algo simples no aplicativo Android. Como é possível voltar a uma atividade anterior.

Qual código eu preciso para voltar à atividade anterior

Troj
fonte
5
Acompanhe a última atividade aberta
Vuk
54
Você simplesmente conclui a chamada (); Cheers
Nguyen Minh Binh
super.finish (); se você está ligando de dentro da atividade!
happyhardik
5
Uma pergunta aqui: se o Android destruiu a atividade anterior devido a menos memória ou outros problemas, essa atividade não estaria mais no backstack e o que acontece?
Ensolarado
@ Sunny Suponho que o coletor de lixo comece com a atividade mais alta da pilha. Portanto, se não houver atividade anterior, também não haverá atividade atual. Mas presumo isso porque esse comportamento faria mais sentido do que liberar memória em uma pilha sem nenhuma ordem específica. Corrija meu comentário, se alguém souber exatamente.
Sedat Kilinc

Respostas:

486

As atividades do Android são armazenadas na pilha de atividades. Voltar a uma atividade anterior pode significar duas coisas.

  1. Você abriu a nova atividade de outra atividade com startActivityForResult . Nesse caso, você pode simplesmente chamar a função finishActivity () do seu código e isso o levará de volta à atividade anterior.

  2. Acompanhe a pilha de atividades. Sempre que você inicia uma nova atividade com uma intenção, pode especificar um sinalizador de intenção como FLAG_ACTIVITY_REORDER_TO_FRONTou FLAG_ACTIVITY_PREVIOUS_IS_TOP. Você pode usar isso para alternar entre as atividades em seu aplicativo. Ainda não os usei muito. Dê uma olhada nas bandeiras aqui: http://developer.android.com/reference/android/content/Intent.html

Conforme mencionado nos comentários, se a atividade for aberta com, startActivity()então pode-se fechá-la finish(). Se você deseja usar o botão Para cima, pode capturá-lo no onOptionsSelected(MenuItem item)método, verificando o ID do item, android.R.id.homediferente do R.id.homemencionado nos comentários.

Abhinav
fonte
237
Ou, se você abriu a atividade com startActivity (), pode fechar com finish () (não precisa passar nenhum parâmetro)
neworld
3
Você pode esclarecer onde e como você usa o acabamento () para que quando o usuário pressiona o botão para cima leva-los a atividade anterior
RicNjesh
4
@RicNjesh No método onOptionsItemSelected, se o menu clicado tiver o ID R.id.home, chame finish (). Ele fechará a atividade atual e o levará de volta à atividade que a iniciou com startActivity ()
Anders Ullnæss
Estou fazendo com que o usuário passe por muitas atividades, uma após a outra, através de intenções. Preciso fazer alguma coisa para garantir que o aplicativo não trava com muitas atividades na pilha? Obrigado!
Ruchir Baronia
1
você tem certeza de que a atividade 1 não morrerá em algum momento antes de terminar a atividade 2?
user924
225

Tente Activity#finish(). Isso é mais ou menos o que o botão Voltar faz por padrão.

adamp
fonte
1
porque #? ou é um ponto?
Nabin
8
Eu acredito que ele quis dizerthis.finish();
Jens Bodal
69
O #é um indicador que finish()é um método não estático da classe Activity. Não é Java válido, mas ajuda a explicar como se pode usar o método.
precisa saber é o seguinte
2
@ Tanis.7x Existe e indicador para métodos estáticos?
Benten
8
@ Benten isso seria ., ou seja:Activity.someStaticMethod()
JonnyReeves 5/15
81

Basta escrever no clique em Concluir () . O levará para a Atividade anterior.

Umer Rana
fonte
1
Embora onBackPressed () também funcione, acho que essa solução é melhor para pensar em sair de uma atividade que você precisa apenas um pouco. Por exemplo, um scanner de OCR no meu caso. Obrigado!
Gene Bo
Isso satisfaz a minha necessidade .. Obrigado.
Roon13
68

Só isso

super.onBackPressed();
AtanuCSE
fonte
2
Essa chamada termina a atividade atual e mostra a última atividade visível. No entanto, se não houver atividade anterior ou ela for destruída, o aplicativo poderá sair.
R1k0
22
Isso é tolice. Você não deveria ligar diretamente para isso. Este é um dos métodos do ciclo de vida e deve ser chamado pelo sistema Android.
Dheeraj Bhaskar
33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Isso levará você a uma atividade anterior, mantendo sua pilha e limpando todas as atividades depois da pilha.

Por exemplo, se a pilha era A-> B-> C-> D e você inicia B com esse sinalizador, a pilha será A-> B

Dmitry Ryadnenko
fonte
É isso que funciona do meu lado. Gostaria de descobrir o que faria com que finish () não funcionasse.
Relm
20

Você deseja controlar o comportamento do botão Voltar? Você pode substituir o botão Voltar (para acessar uma atividade específica) através de um dos dois métodos.

Para o Android 1.6 e abaixo:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

Ou se você suporta apenas o Android 2.0 ou superior:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

Para mais detalhes: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

Bryan Denny
fonte
19

Basta chamar esse método para concluir a atividade atual ou voltar ao onBackPressed

finish();

OU

onBackPressed();
Akshay Paliwal
fonte
Estou fazendo com que o usuário passe por muitas atividades, uma após a outra, através de intenções. Preciso fazer alguma coisa para garantir que o aplicativo não trava com muitas atividades na pilha? Obrigado!
Ruchir Baronia
13

se você quiser ir, só quer ir para a atividade anterior, use

finish();

OU

onBackPressed();

se você quiser ir para a segunda atividade ou abaixo, use o seguinte:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);
Ram G.
fonte
1
Descobri que finish () e onBackPressed () funcionam, mas, pelo menos no meu aplicativo, finish () é muito lento e onBackPressed () é muito mais rápido. Curioso.
scrayne
Estou fazendo com que o usuário passe por muitas atividades, uma após a outra, através de intenções. Preciso fazer alguma coisa para garantir que o aplicativo não trava com muitas atividades na pilha? Obrigado!
Ruchir Baronia
13

Adicione isso ao seu método onCLick (), ele voltará à sua atividade anterior

terminar();

ou Você pode usar isso. Funcionou perfeitamente para mim

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }
Darshuu
fonte
11

Se você configurou corretamente o arquivo AndroidManifest.xml com a atividade pai, poderá usar:

NavUtils.navigateUpFromSameTask(this);

Onde esta é a sua atividade infantil.

Thomas Decaux
fonte
8

Tente fazer isso, pois você deve pressionar o botão Voltar

finish();
onBackPressed();
Muhammed Fasil
fonte
7

Você pode ligar explicitamente onBackPressedda maneira mais fácil.
Consulte Voltar à atividade anterior para obter detalhes

Labeeb Panampullan
fonte
7

Tenho o mesmo problema e

finish();  OR super.onBackPressed();

funcionou bem para mim, ambos funcionaram da mesma forma, mas sem sorte com return

NoNaMe
fonte
6

Inicie a segunda atividade usando intent (use startActivityou de startActivityForResultacordo com seus requisitos). Agora, quando o usuário pressionar o botão Voltar, a atividade atual na parte superior será fechada e a anterior será exibida.

Agora, digamos que você tenha duas atividades, uma para selecionar algumas configurações para o usuário, como idioma, país etc., e após selecioná-lo, o usuário clica no botão Avançar para acessar o formulário de login (por exemplo). Agora, se o login não tiver êxito, o usuário estará na atividade de login, e se o login for bem-sucedido?

Se o login for bem-sucedido, você deverá iniciar outra atividade. Isso significa que uma terceira atividade será iniciada e ainda existem duas atividades em execução. Nesse caso, será bom usar startActivityForResult. Quando o login for bem-sucedido, envie os dados OK de volta à primeira atividade e feche a atividade de login. Agora, quando os dados forem recebidos, inicie a terceira atividade e feche a primeira, usando Concluir.

Altaf Hussain
fonte
Estou fazendo com que o usuário passe por muitas atividades, uma após a outra, através de intenções. Preciso fazer alguma coisa para garantir que o aplicativo não trava com muitas atividades na pilha? Obrigado!
Ruchir Baronia
5

Você pode tentar isso:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
Nikki
fonte
4

Todas as novas atividades / intenções, por padrão, têm um comportamento anterior / anterior, a menos que você tenha codificado um finish()na atividade de chamada.

ameyx
fonte
4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

e se você quiser no botão, clique em voltar e simplesmente coloque

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});
Md Hussain
fonte
3
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
      int id = item.getItemId();

      if ( id == android.R.id.home ) {
          finish();
          return true;
      }

      return super.onOptionsItemSelected(item);
 }

Tente isto funciona tanto no botão voltar barra de ferramentas como botão de hardware para trás .

Puni
fonte
2

Sugiro o NavUtils.navigateUpFromSameTask (), é fácil e muito simples, você pode aprender com o desenvolvedor do google. Desejo poder ajudá-lo!

wuxue
fonte
1

Existem alguns casos para voltar à sua atividade anterior:

Caso 1: se você deseja retornar o resultado à sua atividade anterior, ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

Caso 2: ActivityA -> FBHelperActivity ----> ActivityA

ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivity(intent);

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.
Gyan Swaroop Awasthi
fonte
1

Primeiro, lembre-se de que, se você quiser voltar para uma atividade anterior. Então não chame o método finish () quando for para outra atividade usando Intent.

Depois disso, você tem duas maneiras de voltar da atividade atual para a atividade anterior:

Simplesmente chame: finish()em botão, clique em ouvinte, ou Substitua o seguinte método para voltar usando o botão voltar do sistema:

@Override
public void onBackPressed() {
    super.onBackPressed();
}
Monir Zzaman
fonte
0

Além de todas as respostas mencionadas, ainda é uma maneira alternativa de fazer isso, digamos que você tenha duas classes, classe A e classe B.

Classe A, você fez algumas atividades como a caixa de seleção, imprimiu alguns dados e pretendeu a classe B. Classe B, você gostaria de passar vários valores para a classe A e manter o estado anterior da classe A, você pode usar, tente esta alternativa método ou faça o download do código-fonte para demonstrar isso

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

ou

http://developer.android.com/reference/android/content/Intent.html

Daniel Nyamasyo
fonte
0

Apenas tente isso na primeira atividade

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

Na sua segunda atividade

@Override
public void onBackPressed() {
    this.finish();
}
byteC0de
fonte
pára de funcionar, os dados não persiste eu acho
john ktejik