android-activity activity - Wie starte ich eine Android-Aktivität neu?




title bar (16)

Wie starte ich eine Android- Activity ? Ich habe Folgendes versucht, aber die Activity beendet.

public static void restartActivity(Activity act){

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

}

Answers

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

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

Vor dem SDK 11 ist eine Möglichkeit, dies zu tun:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

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

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

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

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

Bitte geben Sie an, was Sie zu tun versuchen.


Nur um die Antworten von Ralf und Ben zu kombinieren (einschließlich Änderungen in 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);
}

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

finish();
startActivity(getIntent());

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,


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

versuche das zu benutzen ..


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


In Verbindung mit seltsamem SurfaceView Lifecycle-Verhalten mit der Kamera . Ich habe herausgefunden, dass sich recreate () mit dem Lebenszyklus von SurfaceViews nicht gut verhält. SurfaceDestroyed wird während des Erholungszyklus nicht aufgerufen. Es heißt nach onResume (seltsam), an diesem Punkt ist meine SurfaceView zerstört.

Die ursprüngliche Art, eine Aktivität wiederherzustellen, funktioniert einwandfrei.

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 die Zukunft führen kann, weil es meine Probleme mit SurfaceViews behoben hat


Die Lösung für Ihre Frage ist:

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 hilfreich..und funktioniert für mich.


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

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


Es gibt einen Hacky-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 im Allgemeinen Ihre Aktivität neu (außer Sie überschreiben diese). Diese Methode ist nützlich für 180-Grad-Drehungen, wenn Android Ihre Aktivität nicht neu erstellt.


Auch wenn dies mehrfach beantwortet wurde.

Wenn ich eine Aktivität von einem Fragment neu starte, 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);
        }
    });

Du denkst vielleicht, dass das ein wenig übertrieben ist? Mit der Handler Buchung können Sie dies jedoch in einer Lebenszyklusmethode aufrufen. Ich habe dies in onRestart / onResume Methoden verwendet, als ich überprüft habe, ob sich der Status zwischen dem onResume des Benutzers zur App geändert hat. (etwas installiert).

Ohne den Handler wenn Sie ihn an einem seltsamen Ort aufrufen, wird die Aktivität einfach beendet und nicht neu gestartet.

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

Prost, Chris


Ich habe meinen Theme Switcher so gemacht:

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

Im Grunde rufe ich finish() zuerst an, und ich benutze exakt die gleiche Absicht, mit der diese Aktivität gestartet wurde. Das scheint der Trick zu sein?

UPDATE: Wie unten von Ralf erwähnt, 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 vergiss nicht, Ralfs Antwort zu verbessern!)


Wenn Sie von einem Fragment anrufen, tun Sie dies unter dem Code.

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

benutze das

this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);




android android-activity