it-swarm.com.de

Wie starte ich eine Android-Aktivität neu?

Wie starte ich ein Android Activity neu? Ich habe folgendes versucht, aber Activity wird einfach beendet.

public static void restartActivity(Activity act){

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

}
339
user157195

Ich habe meinen Theme Switcher so gemacht:

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

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

UPDATE: Wie von Ralf unten ausgeführt, ist Activity.recreate() der Weg in API 11 und darüber hinaus. Dies ist vorzuziehen, wenn Sie sich in einer API11 + -Umgebung befinden. Sie können immer noch die aktuelle Version überprüfen und das obige Code-Snippet aufrufen, wenn Sie sich in API 10 oder darunter befinden. (Bitte vergessen Sie nicht, die Antwort von Ralf zu bestätigen!)

577
EboMike

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

Die recreate () -Methode verhält sich wie eine Konfigurationsänderung, daher werden Ihre onSaveInstanceState () - und onRestoreInstanceState () -Methoden ggf. auch aufgerufen.

332
Ralf

Vor dem 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);
}
125
Ben

Um nur 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);
}
109
JustinMorris

Ich habe diesen Code verwendet, damit ich ältere Android-Versionen weiterhin unterstützen und 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());
    }
}

Probe:

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());
        }
    }
}
20
Thomas Vos

Diese Lösung hat für mich funktioniert.

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

Beispielcode:

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

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

finish();
startActivity(getIntent());
18
Abhishek Soni

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,

17
Nikhil Dinesh

Obwohl dies mehrfach beantwortet wurde.

Wenn Sie eine Aktivität von einem Fragment aus neu starten, würde ich Folgendes tun:

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 vielleicht, dass dies ein wenig übertrieben ist? Aber die Handler-Veröffentlichung ermöglicht es Ihnen, dies in einer Lebenszyklusmethode aufzurufen. Ich habe dies in onRestart/onResume-Methoden verwendet, um zu überprüfen, ob sich der Status zwischen dem Benutzer geändert hat, der zur App zurückkehrt. (etwas installiert). 

Ohne die Variable Handler wird die Aktivität abgebrochen und nicht neu gestartet, wenn Sie sie an einer ungeraden Stelle aufrufen.

Fühlen Sie sich frei, um Fragen zu stellen.

Prost, Chris

15
Chris.Jenkins

Nun, das ist nicht aufgelistet, aber eine Kombination von einigen, die bereits veröffentlicht wurden:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
15
Codeversed
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

versuchen Sie das zu benutzen ..

3
Amsheer

In Verbindung mit merkwürdigem SurfaceView-Lebenszyklusverhalten mit der Kamera . Ich habe festgestellt, dass recreate () sich nicht gut mit dem Lebenszyklus von SurfaceViews verhält. surfaceDestroyed wird während des Erholungszyklus nicht aufgerufen. Es wird nach onResume (seltsam) aufgerufen. Dann wird mein SurfaceView zerstört.

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

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

Ich kann nicht genau herausfinden, warum das so ist, aber es ist nur eine Beobachtung, die hoffentlich andere in der Zukunft lenken kann, weil sie meine Probleme behoben hat, die ich mit SurfaceViews hatte

3
The4thIceman

Es gibt eine harte Methode, die 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 im Allgemeinen Ihre Aktivitäten neu (sofern Sie sie nicht überschreiben). Diese Methode ist nützlich für 180-Grad-Rotationen, wenn Android Ihre Aktivität nicht neu erstellt. 

3
Achal Dave

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

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

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 eine neue Aktivität zu beginnen und die aktuelle Aktivität zu beenden.

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

2
Rajesh Peram

Wenn Sie die letzte Zeile entfernen, erstellen Sie eine neue act-Aktivität, aber Ihre alte Instanz ist noch am Leben.

Müssen Sie die Aktivität erneut starten, wenn die Ausrichtung geändert wird (d. H. Ihr Status wird gespeichert und an onCreate(Bundle) übergeben)?

Wenn Sie dies nicht tun, besteht eine mögliche Problemumgehung darin, eine zusätzliche Dummy-Aktivität zu verwenden, die von der ersten Aktivität aus gestartet wird und welcher Job eine neue Instanz davon starten soll. Oder verzögern Sie einfach den Aufruf an act.finish(), nachdem der neue gestartet wurde.

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

Bitte geben Sie an, was Sie zu tun versuchen.

1

sie können einfach verwenden 

onRestart ()

methode wie folgt

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

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

0
SuKu

Ich frage mich, warum niemand Intent.makeRestartActivityTask() mantionniert hat, der genau diesen Zweck erfüllt.

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

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

Diese Methode setzt Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK als Standardflags.

0
shkschneider