So starten Sie die Aktivität in Android neu

381

Wie starte ich ein Android neu Activity? Ich habe folgendes versucht, aber das Activityhört einfach auf.

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}
Samet ÖZTOPRAK
quelle
9
Die Aktivität wird beendet, weil Sie "act.finish ()" aufgerufen haben. unmittelbar nach dem Erstellen der Aktivität ...
Nikhil Dinesh
1
veraltete Methode
pedjjj

Antworten:

623

Ich habe meinen Theme Switcher so gemacht:

Intent intent = getIntent();
finish();
startActivity(intent);

Grundsätzlich rufe ich finish()zuerst an und verwende genau die gleiche Absicht, mit der diese Aktivität gestartet wurde. Das scheint den Trick zu tun?

UPDATE: Wie von Ralf weiter unten ausgeführt, Activity.recreate()ist dies der richtige Weg in API 11 und darüber hinaus. Dies ist vorzuziehen, wenn Sie sich in einer API11 + -Umgebung befinden. Sie können weiterhin die aktuelle Version überprüfen und das obige Code-Snippet aufrufen, wenn Sie sich in API 10 oder niedriger befinden. (Bitte vergiss nicht, Ralfs Antwort zu bewerten!)

EboMike
quelle
36
Und das ist eine Abstimmung wert? Dies war keine vom OP erwähnte Anforderung. In der Tat kann es erwünscht sein.
EboMike
9
Wenn Ihnen die Animation nicht gefällt, können Sie sie deaktivieren (wie Sie in Ihrer Antwort gezeigt haben). Das macht meine Antwort per se nicht falsch, es werden nur einige zusätzliche Optionen nicht angezeigt, die Sie hinzufügen können (und die in der Frage nicht gefragt wurden).
EboMike
28
Ich denke, du hast das falsch verstanden. Ein Downvote bedeutet eine falsche / schlechte Antwort, und ein Upvote bedeutet, dass eine Antwort großartig ist. Wie gut eine Antwort im Vergleich zu anderen ist, zeigt die Anzahl der Upvotes. Ich kann sehen, dass Sie versuchen, Ihre Antwort zu fördern, aber Sie missbrauchen das System zu diesem Zweck.
EboMike
8
+1 - das hat bei mir großartig funktioniert, und wie Sie sagen, die Animation ist etwas, das ich wollte, sodass der Benutzer weiß, dass sie neu gestartet wird. FWIW, ich mache es zur Regel, die Antworten anderer Benutzer niemals herunterzustimmen, wenn ich eine alternative Antwort auf die Frage gebe, obwohl ich gelegentlich nach oben stimme, wenn meine Antwort überdurchschnittlich ist (ohne zu sagen, dass dies hier passiert ist, nur dass ich es tue). .
Michael Bray
4
EboMike und Ben: Beide Lösungen haben die Frage des OP beantwortet. Jemandes Antwort nur aus "ästhetischen" Gründen abzulehnen, ist nicht großartig. Ich würde jeden davon abhalten, es hier bei Stackoverflow zu tun ...
ChuongPham
368

Seit API Level 11 (Honeycomb) können Sie die Methode recreate () der Aktivität aufrufen (dank dieser Antwort).

Die Methode recreate () verhält sich wie eine Konfigurationsänderung. Daher werden gegebenenfalls auch die Methoden onSaveInstanceState () und onRestoreInstanceState () aufgerufen.

Ralf
quelle
3
Was ist, wenn die vorherige Aktivität diese mit startActivityForResult aufgerufen hat?
Android-Entwickler
1
Nun, es ist die richtige Antwort, wenn Sie nichts niedrigeres als API 11 unterstützen müssen.
Edward Falk
@EdwardFalk Gibt es eine Funktion, die dies in der Support-Bibliothek ausführt?
Android-Entwickler
2
Dies funktioniert nicht in allen Fällen. Wenn Sie beim Aufrufen von recreate () eine Navigationsleiste geöffnet haben, bleibt diese beim Neuerstellen geöffnet. Dies bedeutet, dass der Status gespeichert wird, was möglicherweise nicht wünschenswert ist.
Chapz
Ich bin derjenige, der nicht will, dass der Staat gerettet wird. Manchmal wollen die Leute nur einen sauberen Neustart, dann sollten sie die Antwort von EboMike verwenden.
Kimi Chiu
132

Vor SDK 11 ist dies folgendermaßen möglich:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
Ben
quelle
Auf dem HTC Desire bleiben Animationen erhalten (zumindest bei Verwendung in der onConfigurationChanged-Methode). Sie treten nicht immer auf, aber mit EboMikes Code treten sie auch nicht immer auf.
Juozas Kontvainis
8
Dies funktioniert nicht bei der Hauptaktivität, die vom Launcher gestartet wurde. Ihre Aktivität wird aufgrund einiger der für die Absicht gesetzten Flags ausgeblendet. Ansonsten funktioniert es gut.
Thomas Ahle
Guter Punkt. macht Sinn, weil es finish () von der Basisaktivität im Stapel aufruft.
Ben
Wenn wir dies nennen, während wir das Thema der Aktivität ändern, scheint dies die Geschwindigkeit (ohne Animationen)
hervorzuheben
3
+1 Funktioniert gut, für mich auch mit der Hauptaktivität. Sie sollten jedoch anrufenoverridePendingTransition(0, 0); nach finish()und startActivity()jeweils nicht , wo Sie es genannt ...
caw
115

Nur um die Antworten von Ralf und Ben zu kombinieren (einschließlich Änderungen in den Kommentaren):

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

    startActivity(intent);
    overridePendingTransition(0, 0);
}
Justin Morris
quelle
8
Beste Antwort von allen. Ob Sie es glauben oder nicht, ich unterstütze immer noch API 3-Geräte und der Wert VERSION.SDK_INT erfordert API 4. :)
Edward Falk
31

Ich habe diesen Code verwendet, damit ich noch ältere Android-Versionen unterstützen und verwenden kann recreate() auf neueren Android-Versionen verwenden kann.

Code:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

Stichprobe:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}
Thomas Vos
quelle
ist eine großartige Arbeit für mich !!
Papo
22

Diese Lösung hat bei mir funktioniert.

Beenden Sie zuerst die Aktivität und starten Sie sie dann erneut.

Beispielcode:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}
user3748515
quelle
20

Dies ist bei weitem der einfachste Weg, um die aktuelle Aktivität neu zu starten:

finish();
startActivity(getIntent());
Abhishek Soni
quelle
19

Rufen Sie diese Methode auf

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

Vielen Dank,

Nikhil Dinesh
quelle
1
Ich denke, das OP möchte jede Aktivität neu starten, nicht nur die erste, aber das war hilfreich für mich.
Kristopher Johnson
1
Die beiden Flaggen sind gut zu wissen, mein Fall schien nichts ohne sie zu tun.
Owen B
1
es hat dank dir funktioniert! Gott schütze dich .
Vivek
16

Obwohl dies mehrfach beantwortet wurde.

Wenn ich eine Aktivität von einem Fragment aus neu starten würde, würde ich es so machen:

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

Sie denken also vielleicht, dass dies ein wenig übertrieben ist? Mit der HandlerBuchung können Sie dies jedoch in einer Lebenszyklusmethode aufrufen. Ich habe diese Methode in onRestart/ onResumeverwendet, um zu überprüfen, ob sich der Status zwischen dem Benutzer, der zur App zurückkehrt, geändert hat. (etwas installiert).

Ohne das, Handlerwenn Sie es an einer ungeraden Stelle aufrufen, wird die Aktivität nur beendet und nicht neu gestartet.

Fühlen Sie sich frei, Fragen zu stellen.

Prost, Chris

Chris.Jenkins
quelle
2
Tolle Lösung und sehr gute Argumentation / Erklärung für den Handler.
JRomero
1
Warum rufen Sie zweimal "overridePendingTransition" auf?
Android-Entwickler
1
@androiddeveloper Ich kann mich nicht erinnern, ich denke, es war eine Lösung für einen Fehler. Sie können es einmal vor startActivity () aufrufen und es wird wie gesagt funktionieren.
Chris.Jenkins
Nachdem ich dies in meiner onResume-Funktion implementiert habe, stoppt das Spiel auf meiner onStop-Methode und hat einen schwarzen Bildschirm ... nicht sicher warum
Scumble373
1
Hallo Chris, kannst du das etwas näher erläutern? "Ohne den Handler wird die Aktivität nur beendet und nicht neu gestartet, wenn du sie an einer seltsamen Stelle aufrufst." ?
Parvez Rafi
15

Nun, dies ist nicht aufgeführt, aber eine Kombination von einigen, die bereits veröffentlicht wurde:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
Codeversiert
quelle
Es funktioniert für mich .. danke .. aber ich möchte Sie fragen: Warum läuft meine App relativ langsam, wenn ich den ersten Teil des Codes (der den SDK_INT überprüft) entferne? !! .. wenn ich den Code wieder anhänge, läuft er relativ und offensichtlich viel schneller !!!
McLan
2
Da bin ich mir nicht sicher. Wenn Sie ein SDK verwenden, das> = 11 ist, sollte recreate () schneller sein, als Absichten zu erhalten, zu beenden und dann erneut zu starten. Beenden Sie den Aufrufcode, der auf onStop ausgeführt wird, und erstellen Sie den Ausführungscode wie eine Änderung der Ausrichtung neu. Es ist also nicht ganz so viel zu tun.
Codeversed
4

In Verbindung mit seltsamem SurfaceView-Lebenszyklusverhalten mit der Kamera . Ich habe festgestellt, dass sich recreate () nicht gut mit dem Lebenszyklus von SurfaceViews verhält. surfaceDestroyed wird während des Erholungszyklus nie aufgerufen. Es wird nach onResume (seltsam) aufgerufen. An diesem Punkt wird meine SurfaceView zerstört.

Die ursprüngliche Art, eine Aktivität neu zu erstellen, funktioniert einwandfrei.

Intent intent = getIntent();
finish();
startActivity(intent);

Ich kann nicht genau herausfinden, warum dies so ist, aber es ist nur eine Beobachtung, die hoffentlich andere in Zukunft leiten kann, da sie meine Probleme mit SurfaceViews behoben hat

The4thIceman
quelle
4

Ich frage mich, warum niemand erwähnt hat Intent.makeRestartActivityTask(), was genau diesen Zweck sauber macht.

Erstellen Sie eine Absicht, mit der die Aufgabe * einer Anwendung * im Basiszustand neu gestartet werden kann.

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));

Diese Methode wird Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASKals Standardflags festgelegt.

shkschneider
quelle
3

Tatsächlich gilt der folgende Code für API-Level 5 und höher. Wenn Ihre Ziel-API niedriger ist, erhalten Sie am Ende etwas, das dem EboMike-Code sehr ähnlich ist.

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
Sandig
quelle
3

Es gibt einen hackigen Weg, der bei jeder Aktivität funktionieren sollte, einschließlich der Hauptaktivität.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

Wenn sich die Ausrichtung ändert, erstellt Android Ihre Aktivität im Allgemeinen neu (es sei denn, Sie überschreiben sie). Diese Methode ist nützlich für 180-Grad-Drehungen, wenn Android Ihre Aktivität nicht neu erstellt.

Achal Dave
quelle
3
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

versuchen Sie dies zu verwenden ..

Amsheer
quelle
3

Die Lösung für Ihre Frage lautet:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

Sie müssen in den Aktivitätskontext wechseln, um neue Aktivitäten zu starten und die aktuelle Aktivität zu beenden.

Hoffe das ist hilfreich ... und funktioniert für mich.

Rajesh Peram
quelle
1

Wenn Sie die letzte Zeile entfernen, erstellen Sie eine neue actAktivität, aber Ihre alte Instanz ist noch aktiv.

Müssen Sie die Aktivität neu starten, beispielsweise wenn die Ausrichtung geändert wird (dh Ihr Status wird gespeichert und an übergeben onCreate(Bundle))?

Wenn Sie dies nicht tun, besteht eine mögliche Problemumgehung darin, eine zusätzliche Dummy-Aktivität zu verwenden, die ab der ersten Aktivität gestartet wird und deren Aufgabe darin besteht, eine neue Instanz davon zu starten. Oder verzögern Sie einfach den Anruf anact.finish() , nachdem der neue gestartet wurde.

Wenn Sie den größten Teil des Status speichern müssen, befinden Sie sich in ziemlich tiefen Gewässern, da es nicht trivial ist, alle Eigenschaften Ihres Status zu übergeben, insbesondere ohne Ihren alten Kontext / Ihre alte Aktivität zu verlieren, indem Sie ihn an die neue Instanz übergeben.

Bitte geben Sie an, was Sie tun möchten.

Dimitar Dimitrov
quelle
1
Ich habe eine Schaltfläche, die verschiedene Themen auf die App anwendet. Nachdem das Thema angewendet wurde, wird es in den Einstellungen gespeichert, die Stammaktivität wird neu gestartet, das Thema wird aus den Einstellungen gelesen und das Thema wird in onCreate () angewendet. Es stellt sich heraus, dass der obige Code gut funktioniert, wenn die Aktivität nicht single_instance ist. Ich bin mir nicht sicher, ob dies die beste Vorgehensweise ist.
Derzeit gibt es keine saubere, SDK-gepflasterte Möglichkeit, Ihre Aktivität neu zu starten, AFAIK - wenn Sie nichts auslaufen, können Sie
Dimitar Dimitrov
0

So mache ich es.

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)
MicroRJ
quelle
-1

Wenn Sie von einem Fragment aus anrufen, gehen Sie wie folgt vor.

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);
Mihir Trivedi
quelle
-4

Sie können einfach verwenden

onRestart ()

Methode wie folgt

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

und rufen Sie onRestart () auf, wo Sie die aktuelle Aktivität neu starten möchten

SuKu
quelle
-5

Rufen Sie die Methode onCreate auf. Zum BeispielonCreate(null);

kike0kike
quelle