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?

hpique
fonte
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.

Sush
fonte
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);
AMAN SINGH
fonte
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.

kingargyle
fonte
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();
Rizwan
fonte
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
13

simplesmente use

this.recreate();

isso acionará o método onCreate na atividade

Yasiru Nayanajith
fonte
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(); //
novecentas
fonte
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.

Al Sutton
fonte
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.
Jorgesys
fonte
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

yoav.str
fonte
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.

become_human
fonte
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.

Cristian
fonte
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.

hpique
fonte
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

Adnan Abdollah Zaki
fonte
2

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


fonte
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.

ANDADOR
fonte
0

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

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}
Rajnish Sharma
fonte
0

eu usei isso e funciona bem sem finish()

startActivity(getIntent());
Hocine Kheddadji
fonte
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);
Anil Kumar
fonte