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


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.


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.


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.


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();

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


É 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


19

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

finish();

OU

onBackPressed();

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);

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);
  }

11

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

NavUtils.navigateUpFromSameTask(this);

Onde esta é a sua atividade infantil.


8

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

finish();
onBackPressed();


7

Tenho o mesmo problema e

finish();  OR super.onBackPressed();

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


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.


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);
}

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.


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();
    }
});

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 .


2

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


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.

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();
}

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


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();
}

pára de funcionar, os dados não persiste eu acho
john ktejik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.