Como fechar a atividade e voltar à atividade anterior no android


144

Tenho uma atividade principal: quando clico em um botão, inicia uma nova atividade, usei o seguinte código para fazer isso:

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

O código acima foi executado a partir da atividade principal.

Agora, na minha nova atividade, chamada pela atividade principal, tenho um botão Voltar. Quando clico neste botão voltar, quero que minha nova atividade seja fechada e ela deve voltar à atividade principal original.

Eu tentei ligar super.finish()e apenas finish() (a partir da nova atividade), mas isso fecha meu aplicativo inteiro (incluindo a minha atividade principal).

Como posso fechar a atividade que está atualmente em foco e retornar à atividade principal?

EDITADO

O fato de o botão voltar do meu telefone também fechar todo o meu aplicativo me leva a pensar que iniciei a segunda atividade incorretamente?


OK, eu tenho procurado,

Criei uma atividade de configurações que usa o mesmo código de manifesto e o mesmo código para iniciar a atividade.

Nas configurações Atividade, quando pressiono o botão Voltar, ele retorna à Atividade principal.

Com a atividade mencionada acima na pergunta principal, ele simplesmente sai do meu aplicativo inteiro.

Portanto, o problema não parece estar no código para concluir a atividade, mas na atividade em si.


4
Você nem precisa de um botão Voltar, deixe o usuário usar a tecla Voltar e você não precisa fazer nada.
Hoan Nguyen 13/03

O botão Voltar de telefones fecha o aplicativo de entrada, não apenas a minha atividade secundária. Não quero encerrar a atividade principal.
Zapnologica 13/03

1
O botão 'voltar' não deve fazer isso - você pode mostrar mais do seu código?
peejaybee

Respondendo à sua edição, a atividade secundária fica bem com o que você postou. Acho que os TGMCians provavelmente têm a resposta certa e você investiga seu manifesto.
Peejaybee

veja esta resposta eu acho que isso vai ajudá-lo
Muhammad Helmi

Respostas:


201

Eu acho que você está chamando o finish()método MainActivityantes de começar SettingsActivity.

O cenário que você descreveu ocorrerá de duas maneiras:

OU

Você definiu android:noHistory = "true"para MainActivitydentro o AndroidManifest.xmlque faz MainActivitycom que finishautomaticamente pressione a tecla Voltar.

OU

Antes de mudar para sua 'SettingsActivity', você ligou finish()para o seu MainActivity, o que o mata. Quando você pressiona o botão Voltar, como nenhuma outra atividade é predefinida na pilha para aparecer, ela volta à tela principal.


Isso explicaria por que o botão 'voltar' do telefone também descarta a atividade principal.
Peejaybee 13/03

Ao depurar, notei que a execução continua após o término (), portanto, é recomendável colocar um retorno além disso.
até

A terceira razão nesta resposta não é apenas uma repetição da primeira?
Pang

60

Você pode voltar para a atividade anterior apenas chamando terminar () na atividade em que está. Observe qualquer código depois que a chamada finish () for executada - você pode simplesmente retornar após ligar para finish () para corrigir isso.

Se você deseja retornar os resultados para a atividade um, ao iniciar a atividade dois, é necessário:

startActivityForResults(myIntent, MY_REQUEST_CODE);

Dentro da atividade chamada, você pode obter o Intent do parâmetro onCreate () ou usado

getIntent();

Para definir retornar um resultado à atividade um, na atividade dois, faça

setResult(Activity.RESULT_OK, MyIntentToReturn);

Se você não tem intenção de retornar, basta dizer

setResult(Activity.RESULT_OK);

Se a atividade tiver resultados ruins, você poderá usar Activity.RESULT_CANCELED (isso é usado por padrão). Então, na atividade um, você faz

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

Para finalizar a atividade dois, use os mesmos métodos com finish (), conforme descrito acima, com os resultados já definidos.


1
"Anote qualquer código após a conclusão da chamada () ser executada - você pode simplesmente retornar após chamar a conclusão () para corrigir isso" Eu acho que 'correção' é uma má escolha de palavras aqui. É mais como se você estivesse evitando a execução das seguintes linhas (não corrigindo).
Lo-Tan

14

Quando você clica no botão, você pode ligar para:

super.onBackPressed();

11

se você usa fragmento você deve usar

getActivity().onBackPressed();

se você usa atividade única, você pode usar

finish();

7

tente este código em vez de finish:

onBackPressed();


2
Funciona bem para voltar do ActivityB para o ActivityA. Para fragmentos e atividades únicas, use a resposta de @Osama Ibrahim.
Eftekhari


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

Acredito que sua segunda atividade provavelmente não esteja ligada à sua atividade principal como atividade infantil. Verifique seu AndroidManifest.xmlarquivo e veja se a <activity>entrada para sua atividade filho inclui um android:parentActivityNameatributo. Deve ser algo como isto:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

Apenas não chame o finish()seu, MainActivitypois isso elimina a necessidade de substituir o onBackPressed()seu, a SecondActivitymenos que você esteja fazendo outras coisas nessa função. Se você sentir a "necessidade" para este botão de volta, então você pode simplesmente chamar finish()no SecondActivitye que vai levá-lo para o seu MainActivityenquanto você não ter chamado finish()sobre ele


Eu tentei essa rota, mas tenho cerca de 10 telas em sequência que usam PNGs de alta resolução. O problema é que, por volta da tela 7, o dispositivo está sem memória devido a todas as atividades na pilha de trás. Decidi chamar a conclusão de cada atividade, e isso corrigiu o problema, permitindo a coleta de lixo, mas agora o comportamento de retorno precisa ser codificado manualmente, porque a pilha de retorno agora está vazia. Você já encontrou esse problema ou conhece algum mecanismo no Android para resolver isso?
Lo-Tan

O que você deseja que o botão Voltar faça? Volte para o que Activityera o anterior ou sempre volte para o MainActivity? Além disso, se você estiver com pouca memória Bitmaps, deve ler esta parte do Documentos . Isso me ajudou
codMagic

@ Lo-Tan, se você quiser voltar à atividade anterior, acho que precisa descobrir o gerenciamento de memória para suas imagens e não concluir as atividades (talvez com o link que forneci). Caso contrário, você terá de recriar uma nova instância da atividade e tentar descobrir qual deles para voltar para
codeMagic

Eu gostaria que o botão voltar fosse para a tela anterior. Esta é uma série de telas de tutorial, basicamente, e o usuário pode avançar / voltar. Cada tela é projetada e usa muitos pngs - às vezes pngs que ocupam a maior parte da tela (não apenas pequenas miniaturas), portanto, consome muita memória para cada tela.
Lo-Tan

@ Lo-Tan Acho que você deseja substituir o método onBackPressed () e, em seguida, apenas criar manualmente a atividade para a qual deseja ir. Você pode finalizar aquele em que está e iniciar o anterior.
Zapnologica 29/10

1

Não sei se isso é útil ou não, mas estava enfrentando o mesmo problema e achei uma maneira bastante fácil, com apenas uma variável booleana global e a ação onResume (). No meu caso, minha Atividade C, se clicada em um botão específico, deve acionar o término () da Atividade B!

Atividade_A -> Atividade_B -> Atividade_C

Activity_A (abre normalmente Activity_B)

Activity_B (em alguns cliques, o botão abre Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

Portanto, sempre que eu clico no botão da Atividade C, ele executa a função "onResume ()" da Atividade B e volta à Atividade A.


1
 @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 .


Este funcionou para mim. Eu também tive um MainActivity e uma SettingsActivity com android:parentActivityName=".MainActivity"para o segundo. Esse código lida com esse botão Início / Voltar no ciclo de ferramentas e apenas conclui a atividade atual retornando à anterior na pilha. Obrigado.
mortalis

1

Concluir fecha o aplicativo inteiro, isso é algo que eu odeio no desenvolvimento do Android, não concluí o que é bom, mas que eles não mantêm a sintaxe ok que possuem

startActivity(intent)

Por que não

closeActivity (intenção)?


1
Isso responde a pergunta? Ou isso é apenas uma sugestão a ser tentada? Em ambos os casos, o discurso é desnecessária e provavelmente não acolher no SO
Gilles Gouaillardet

1

Encontramos uma situação muito semelhante.

Atividade 1 (Abertura) -> Atividade 2 (Visualização) -> Atividade 3 (Detalhe)

Resposta incorreta "na pressão traseira"

  • A pressão traseira do dispositivo na Atividade 3 também fechará a Atividade 2.

Eu verifiquei todas as respostas postadas acima e nenhuma delas funcionou. A sintaxe Java para a transição entre a Atividade 2 e a Atividade 3 foi revisada para estar correta.

Recém codificado ao chamar um aplicativo de terceiros. por uma atividade. Decidimos investigar o ângulo de configuração - eventualmente nos permitindo identificar a causa raiz do problema.

Escopo : Configuração da Atividade 2 (chamador).

Causa Raiz :

android:launchMode="singleInstance"

Solução :

android:launchMode="singleTask"

Aparentemente, nessa questão de " contrapressão ", singleInstance considera as atividades invocadas em uma instância com a atividade chamadora, enquanto que singleTask permitirá que as atividades invocadas tenham sua própria identidade suficiente para que a contrapressão pretendida funcione como deveria.


0
{ getApplicationContext.finish();   }

Tente este método ..


Embora esse bloco de código possa responder à pergunta, seria melhor se você pudesse fornecer uma pequena explicação sobre o motivo.
David

0

pode ser que você esteja chamando de finish (); no evento botão clique para que a atividade principal seja fechada logo após você clicar no botão e quando você voltar da próxima atividade, o aplicativo será encerrado porque a atividade principal já está fechada e não há atividade ativa.


0

no método onCreate da sua atividade, escreva o código a seguir.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

Em seguida, substitua o método selecionado onOptionsItem da sua atividade da seguinte maneira

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

E você está pronto para ir.


0

Você precisa usar isso em sua MainActivity

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

O sinalizador iniciará várias tarefas que manterão sua MainActivity; quando você ligar para terminar, matará a outra atividade e o levará de volta à MainActivity.

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.