Aktivität in Android neu laden


220

Ist es eine gute Praxis, ein Activityin Android neu zu laden ?

Was wäre der beste Weg, dies zu tun? this.finishund dann this.startActivitymit der Aktivität Intent?


3
Ich bin kein erfahrener Android-Entwickler, aber ein Neustart einer Aktivität klingt nach schlechtem Design und sollte nur in extremen Fällen durchgeführt werden.
Hudson

@Hudson Das passiert bei Konfigurationsänderungen. Ob das gutes Design ist oder nicht, es ist eine ganz andere Diskussion. ;)
hpique

1
@ Hudson Also Sie sind jetzt 5 Jahre Erfahrung Entwickler: D
Pratik Butani

@PratikButani, kenne ich dich? :) Ich habe jetzt 8 Jahre Erfahrung, aber nicht viel in der Android-Entwicklung.
Hudson

Sie haben mein Profil besucht, das ich kenne: P @ Hudson
Pratik Butani

Antworten:


521

Sie können einfach verwenden

finish();
startActivity(getIntent());

ein Activityaus sich heraus erfrischen .


2
Was ist, wenn es nicht innerhalb der Aktivitätsklasse aufgerufen werden kann? Auf irgendeine Weise mit der Kontextreferenz?
Giorgiline

1
@giorgiline - Ja, erstellen Sie eine Schnittstelle, die Sie innerhalb der Aktivitätsklasse definieren, und übergeben Sie diese Schnittstelle als Parameter an die externe Klasse, von der aus Sie sie verwenden.
Aggregat1166877

1
Wow, ich hätte NICHT gedacht, dass es so einfach sein würde.
Theblang

1
Wie können Sie mit einer Aktivität umgehen, deren Ergebnis gestartet wurde? Können Sie das neu starten, während der ursprüngliche Anrufer immer noch ein Ergebnis erhält?
Tothphu

1
@tothphu - Nicht ausprobiert, aber theoretisch denke ich ja. Wenn die Aktivität jedoch zum zweiten Mal beendet wird, wird das Ergebnis nicht an die Aktivität zurückgegeben, die sie zum ersten Mal erstellt hat.
Sush

64

Für diejenigen, die dieses Blinken nach der Methode recreate () nicht sehen möchten, verwenden Sie einfach

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

2
Genial! Ich wollte den Übergang überschreiben, damit der Benutzer es nicht bemerkt!
Ceddy Muhoza

Gut gemacht! Der Benutzer würde das Nachladen kaum bemerken.
Sam

38

Dies ist, was ich tue, um die Aktivität nach dem Ändern nach einer Änderung der Einstellungen neu zu laden.

@Override
protected void onResume() {

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

Dies bewirkt im Wesentlichen, dass sich die Aktivität selbst neu zeichnet.

Aktualisiert: Ein besserer Weg, dies zu tun, ist das Aufrufen der recreate()Methode. Dadurch wird die Aktivität neu erstellt.


15
Das mag funktionieren, es wird jedoch dringend empfohlen, Lebenszyklusmethoden nicht explizit aufzurufen.
ITisha

Wenn Sie diesen Weg wählen, sollten Sie eine separate init () -Methode verwenden, die alles einrichtet und von onCreate () und onResume () aus aufruft, anstatt onCreate () aufzurufen.
Tom

1
Eine großartige Lösung, außer dass sie in einigen Situationen nicht funktioniert, wenn Ihre Lebenszyklusmethoden für andere Zwecke verwendet werden. Ich greife beispielsweise auf die Kamera des Telefons zu, und wenn das Foto aufgenommen wird, kehrt der Bildschirm zu meiner Aktivität zurück, um es in einer Ansicht zu veröffentlichen. Durch die Verwendung von Lebenszyklusmethoden zum Aktualisieren werde ich aus dem Kameraprozess ausgeschlossen, und mein Foto kehrt nicht zur Aktivität zurück, sondern ich bekomme die Aktivität von Anfang an. Nur ein Beispiel, das Sie beachten sollten.
Azurespot

1
Es ist wichtig, den Startmodus der Aktivität zu berücksichtigen, wenn Sie recreate () verwenden. Wenn ich beispielsweise recreate () für eine Aktivität mit launchMode = singleTop aufrufe, wird onCreate () danach nicht mehr aufgerufen. OTOH, wenn ich anstatt recreate () explizit finish () und anschließend startActivity () aufrufe, wird onCreate () danach aufgerufen.
Albert C. Braun

14

Ich habe frühere Antworten gesehen, die zum erneuten Laden der Aktivität mit Intent gegeben wurden. Diese funktionieren, aber Sie können dasselbe auch mit der Methode recreate () tun, die in der Aktivitätsklasse selbst angegeben ist.

Anstatt dies zu schreiben

// Hauptaktivität beim Schließen des Dialogfelds aktualisieren

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

Dies kann nur durch Schreiben erfolgen

recreate();

recreate()war die Lösung für mich - "Neustart" der Aktivität funktionierte nicht für mich, da ich die Aktivität mit "StartActivityForResult" gestartet habe und das Verhalten dadurch unterbrochen wurde.
KYL3R

13

einfach benutzen

this.recreate();

Dadurch wird die onCreate-Methode in der Aktivität ausgelöst


10

Ich musste schnell eine Nachrichtenliste in einer meiner Anwendungen aktualisieren, daher habe ich nur eine Aktualisierung meiner Hauptbenutzeroberflächenaktivität durchgeführt, bevor ich den Dialog geschlossen habe, in dem ich mich befand. Ich bin sicher, dass es auch bessere Möglichkeiten gibt, dies zu erreichen.

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

9

Android enthält ein Prozessmanagementsystem, das die Erstellung und Zerstörung von Aktivitäten übernimmt und den Nutzen eines manuellen Neustarts einer Aktivität weitgehend zunichte macht. Weitere Informationen dazu finden Sie unter Anwendungsgrundlagen

Es empfiehlt sich jedoch sicherzustellen, dass Ihre Methoden onPause und onStop alle Ressourcen freigeben, an denen Sie nicht festhalten müssen, und onLowMemory verwenden , um die Anforderungen Ihrer Aktivitäten auf ein absolutes Minimum zu reduzieren.


2
+1 für die Erwähnung von onLowMemory. Ich wusste nicht, dass es eine solche Methode gibt!
hpique

4

Beginnen Sie mit der gleichen Absicht activityund schließen Sie die activity.

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

4

In einigen Fällen ist es die beste Vorgehensweise, in anderen Fällen ist es keine gute Idee, dass es kontextabhängig ist, wenn Sie sich dafür entscheiden. Der folgende Weg ist der beste Weg, um von einer Aktivität zu ihren Söhnen überzugehen:

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

Die Sache ist, wann immer Sie () von activityIWishToRun beenden, kehren Sie zu Ihrer lebenden Aktivität zurück


1
Das ist vielleicht alt, aber du hast mir gerade viel Zeit gespart! :)
Lior Iluz

4

Das Nachladen Ihrer gesamten Aktivität kann eine schwere Aufgabe sein. Fügen Sie einfach den Teil des Codes ein, der aktualisiert werden muss ( kotlin ):

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

Java:

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

}

Und rufen Sie bei Bedarf " onResume () " auf.


2

Ich denke nicht, dass das eine gute Idee ist ... es wäre besser, eine sauberere Methode zu implementieren. Wenn Ihre Aktivität beispielsweise ein Formular enthält, kann die Cleaner-Methode einfach jedes Widget im Formular löschen und alle temporären Daten löschen. Ich denke, das ist es, was Sie wollen: Stellen Sie die Aktivität in ihren ursprünglichen Zustand zurück.


Eigentlich möchte ich den Anwendungsstatus ändern und dann die Aktivität neu laden, um die Änderung widerzuspiegeln.
Hpique

Wie ist der "Bewerbungsstatus" in Ihrem Fall? Vorlieben?
Zehrer

2

Nachdem ich eine Weile damit experimentiert habe, habe ich keine unerwarteten Konsequenzen beim Neustart einer Aktivität festgestellt. Ich glaube auch, dass dies sehr ähnlich zu dem ist, was Android standardmäßig tut, wenn sich die Ausrichtung ändert, daher sehe ich keinen Grund, dies unter ähnlichen Umständen nicht zu tun.


Im Gegenteil, ich habe versucht, meinen Bildschirm durch Neustart der Aktivität zu "aktualisieren". Es erscheint nicht an der Oberfläche, irgendetwas ist schiefgegangen, meine Informationen wurden so aktualisiert, wie ich es wollte, der LogCat erzählt eine andere Geschichte. In LogCat gehe ich zurück zur onCreate-Methode der Aktivität, die versucht, Einstellungen abzurufen. 1. Versuch Ich erhalte eine Nullzeigerausnahme, dann wird erneut versucht, in onCreate zu starten, und das gespeicherte Ref wird beim 2. Mal empfangen. Ich bin mir nicht sicher, was hier los ist, aber ich wollte nur sichergehen, dass Sie nicht nur das Ergebnis betrachten, denn WYSIWIG war bei mir nicht der Fall.
Taraloca

Wie genau starten Sie die Aktivität neu?
Hpique

2

Ich habe das gleiche Problem

import android.support.v4.content.IntentCompat;

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

Dieser Code funktioniert für mich. Android API 17


2

In einer Aktivität können Sie aufrufen recreate(), um die Aktivität "neu zu erstellen" (API 11+).


1

Ich hatte einen anderen Ansatz wie: Die Einstellung launchModemeiner Aktivität auf singleTopund ohne Anruf finish(), startActivity(getIntent())wird einfach den Job machen. Sie müssen sich nur um die neuen Daten in onCreate()und kümmern onNewIntent. Auf Sushs Art kann die Anwendung blinken, wie AMAN SINGH sagte. Aber AMAN SINGHs Ansatz wird immer noch eine neue Aktivität schaffen, die irgendwie unnötig ist, selbst wenn er das "Blink" -Problem behoben hat, denke ich.

Für diese Frage zu spät, aber wenn jemand nach einer Lösung sucht, ist sie hier.


0

Nach dem Login hatte ich das gleiche Problem, also habe ich verwendet

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

0

Ich habe dies verwendet und es funktioniert gut ohne finish()

startActivity(getIntent());

0

Für mich funktioniert es, es werden keine weiteren Absichten erstellt und auf diese Weise werden die neuen Daten der Absichten geladen.

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.