Recarregar atividade no Android


220

É uma boa prática recarregar um Activityno Android ?

Qual seria a melhor maneira de fazer isso? this.finishe depois this.startActivitycom a atividade Intent?


3
Eu não sou um desenvolvedor Android experiente, mas reiniciar uma atividade parece um projeto ruim e só deve ser feito em casos extremos.
Hudson

@ Hudson É o que acontece nas alterações de configuração. Se esse é um bom design ou não, é outra discussão inteiramente. ;)
hpique

1
@Hudson Então você está agora 5 anos de experiência do desenvolvedor: D
Pratik Butani

@PratikButani, eu te conheço? :) Tenho 8 anos de experiência agora, mas não muito no desenvolvimento do Android.
Hudson

Você visitou meu perfil, eu sei: P @Hudson
Pratik Butani 28/02/19

Respostas:


521

Você pode simplesmente usar

finish();
startActivity(getIntent());

para atualizar um Activityde dentro de si.


2
E se não puder ser chamado dentro da classe de atividade ?, alguma maneira de fazê-lo com a referência de contexto?
Giorgiline

1
@giorgiline - Sim, crie uma interface que você defina dentro da classe de atividade e passe essa interface como parâmetro para qualquer classe externa da qual você a esteja usando.
aggregate1166877

1
Uau, eu não achei que seria assim tão fácil.
theblang

1
Como você pode lidar com uma atividade iniciada para obter resultados? Você pode reiniciar isso com o chamador original ainda recebendo um resultado?
tothphu

1
@ thothphu - Não tentei embora, mas teoricamente acho que sim. No entanto, na segunda vez em que a atividade for concluída, ele não retornará o resultado à atividade criada pela primeira vez.
Sush

64

para quem não quer ver o método piscar após recrte () , basta usar

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
Impressionante! Eu queria substituir a transição para que o usuário não notasse!
Ceddy Muhoza

Bom trabalho! O usuário mal notaria a recarga.
sam

38

É isso que faço para recarregar a atividade depois de alterar o retorno de uma alteração de preferência.

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

Isso essencialmente faz com que a atividade seja redesenhada.

Atualizado: A melhor maneira de fazer isso é chamar o recreate()método. Isso fará com que a atividade seja recriada.


15
Isso pode estar funcionando, mas não é recomendável chamar métodos de ciclo de vida explicitamente.
ITisha

Se você seguir essa rota, use um método init () separado, que configure tudo e chame isso de onCreate () e onResume (), em vez de chamar onCreate ().
Tom

1
Ótima solução, exceto que não funcionará em algumas situações quando seus métodos de ciclo de vida forem usados ​​para outras coisas. Por exemplo, estou acessando a câmera do telefone e, quando a foto é tirada, a tela retorna à minha atividade para publicá-la em uma visualização. Ao usar métodos de ciclo de vida para atualizar, sou expulso do processo da câmera e minha foto não retorna à atividade, mas recebo a atividade desde o início. Apenas um exemplo para estar ciente.
Azurespot

1
É importante considerar o launchMode da atividade ao usar recreate (). Por exemplo, quando chamo recreare () em uma atividade com launchMode = singleTop, não vejo onCreate () sendo chamado posteriormente. OTOH, se, em vez de chamar recrear (), eu chamar explicitamente terminar () e seguido de startActivity (), eu vejo onCreate () sendo chamado posteriormente.
Albert c braun

14

Vi respostas anteriores que foram fornecidas para recarregar a atividade usando o Intent. Isso funcionará, mas você também pode fazer o mesmo usando o método recreate () fornecido na própria classe Activity.

Em vez de escrever isso

// Atualizar a atividade principal ao fechar a caixa de diálogo

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

Isso pode ser feito escrevendo apenas isso

recreate();

recreate()foi a solução para mim - "reiniciar" a atividade não funcionou para mim, pois iniciei a atividade usando "StartActivityForResult" e interrompeu o comportamento.
KYL3R


10

Eu precisava atualizar uma lista de mensagens em um dos meus aplicativos às pressas, portanto, acabei de executar uma atualização da minha atividade principal da interface do usuário antes de fechar a caixa de diálogo em que estava. Tenho certeza de que há maneiras melhores de fazer isso também.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

O Android inclui um sistema de gerenciamento de processos que lida com a criação e destruição de atividades que nega amplamente qualquer benefício que você veria ao reiniciar manualmente uma atividade. Você pode ver mais informações sobre isso em Fundamentos de aplicativos

O que é uma boa prática é garantir que seus métodos onPause e onStop liberem todos os recursos dos quais você não precisa se apegar e use onLowMemory para reduzir suas necessidades de atividades ao mínimo absoluto.


2
+1 por mencionar onLowMemory. Eu não sabia que esse método existia!
Hpique 01/07

4

Comece com uma intenção igual activitye feche o activity.

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

em alguns casos, é a melhor prática; em outros, não é uma boa ideia orientada ao contexto, se você optar por fazê-lo, usando a seguinte é a melhor maneira de passar de uma atividade para os filhos dela:

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

a coisa é sempre que você termina () de activityIWishToRun e retorna à sua atividade de viver


1
Talvez seja velho, mas você me salvou muito tempo! :)
Lior Iluz

4

Recarregar toda a sua atividade pode ser uma tarefa pesada. Basta colocar a parte do código que deve ser atualizada no ( kotlin ):

override fun onResume() {
    super.onResume()
    //here...
}

Java:

@Override
public void onResume(){
    super.onResume();
    //here...

}

E chame " onResume () " sempre que necessário.


2

Não acho que seja uma boa ideia ... seria melhor implementar um método mais limpo. Por exemplo, se sua atividade tiver um formulário, o método mais limpo poderá limpar cada widget no formulário e excluir todos os dados temporários. Eu acho que é isso que você deseja: restaurar a atividade ao seu estado inicial.


Na verdade, quero alterar o estado do aplicativo e recarregar a atividade para refletir a alteração.
Hpique

Qual é o "estado do aplicativo" no seu caso? Preferências?
Zehrer

2

Depois de experimentar isso por um tempo, não encontrei consequências inesperadas ao reiniciar uma atividade. Além disso, acredito que isso é muito semelhante ao que o Android faz por padrão quando a orientação muda, então não vejo um motivo para não fazê-lo em circunstâncias semelhantes.


Pelo contrário, tentei "atualizar" minha tela reiniciando a atividade. Não aparece na superfície que algo deu errado, minhas informações atualizadas da maneira que eu queria, o LogCat conta uma história diferente. No LogCat, volto ao método onCreate da atividade, ele tenta extrair preferências. 1ª tentativa, recebo uma exceção de ponteiro nulo, depois ele tenta iniciar novamente no onCreate e recebe o storedPref pela 2ª vez. Não tenho certeza do que está acontecendo aqui, mas eu só queria ter certeza de que você não estava simplesmente olhando o resultado, pois WYSIWIG não era o meu caso.
taraloca

Como exatamente você está reiniciando a atividade?
Hpique

2

eu tenho o mesmo problema

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

esse código funciona para mim. Api Android 17


2

Em uma atividade, você pode chamar recreate()para "recriar" a atividade (API 11+)


1

Eu tive outra abordagem, como: definir launchModeminha atividade como singleTope sem ligar finish(), apenas startActivity(getIntent())fará o trabalho. Só tem que se preocupar com os novos dados em onCreate()e onNewIntent. À maneira de Sush, o aplicativo pode piscar como AMAN SINGH disse. Mas a abordagem de AMAN SINGH ainda criará uma nova atividade que, de alguma forma, é desnecessária, mesmo que ele tenha corrigido o problema de 'piscar', eu acho.

Tarde demais para esta pergunta, mas se alguém está procurando uma solução, aqui está ela.


0

Após o login, tive o mesmo problema, então usei

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

para mim, está funcionando, não está criando outros Intents e, no mesmo, os novos dados carregados.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
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.