61 Stimmen

New Intent() startet neue Instanz mit Android: launchMode="singleTop"

Ich habe Aktivität A mit android:launchMode="singleTop" im Manifest.

Wenn ich zu Aktivität gehe B , C und D dort habe ich Menüverknüpfungen, um zu meinen Anwendungen zurückzukehren Wurzelaktivität ( A ).

Der Code sieht wie folgt aus:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

Anstatt jedoch zu der bereits vorhandenen Instanz zurückzukehren A meiner MainActivity.class wird eine neue Instanz erstellt -> es geht zu onCreate() anstelle von onNewIntent() .

Das ist doch nicht das erwartete Verhalten, oder?

71voto

Vidar Vestnes Punkte 41974

Damit sollte es klappen.

<activity ... android:launchMode="singleTop" />

Wenn Sie eine Absicht zum Starten der App erstellen, verwenden Sie:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Das ist das, was gebraucht werden sollte.

2 Stimmen

Dies funktioniert nicht für mich:( unten Zeilen von Code funktioniert gut. <activity ... Android:launchMode="singleTop" /> Intent myIntent = new Intent(getBaseContext(), MainActivity.class); myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(myIntent);

28voto

znq Punkte 43755

Bei mir hat es letztendlich folgendermaßen funktioniert:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

0 Stimmen

Sie können auf einige unerwartetes Verhalten mit singleTop-Aktivität. A mögliche Lösung

0 Stimmen

Großartig! Vielen Dank, Sir :)

14voto

Mark B Punkte 154748

Zitat aus dem Dokumentation :

Die Modi "Standard" und "singleTop". unterscheiden sich nur in einem Punkt voneinander Hinsicht: Jedes Mal, wenn es eine neue Absicht für eine "Standard"-Aktivität gibt, wird eine neue Instanz der Klasse erstellt, um auf diese Absicht zu reagieren. Jede Instanz behandelt eine einzige Absicht. In ähnlicher Weise wird eine neue Instanz einer "singleTop"-Aktivität erstellt werden, um einen neuen Absicht. Allerdings, wenn die Zielaufgabe bereits eine bestehende Instanz von der Aktivität an der Spitze ihres Stapel erhält diese Instanz den neuen Intent (in einem onNewIntent() Aufruf); eine neue Instanz wird nicht erstellt.

Ich bin mir nicht zu 100 % sicher, was "bereits eine bestehende Instanz der Aktivität an der Spitze ihres Stapels hat" bedeutet, aber vielleicht erfüllt Ihre Aktivität diese Bedingung nicht.

Würde singleTask o singleInstance für Sie arbeiten? Oder vielleicht könnten Sie versuchen, die FLAG_ACTIVITY_SINGLE_TOP auf die Absicht, die Sie erstellen, um zu sehen, ob das einen Unterschied macht, obwohl ich nicht glaube, dass es das tut.

0 Stimmen

Es bedeutet, dass der derzeit aktive Aufgabenstapel (Anwendungsstapel) eine Instanz dieser Aktivität an der Spitze hat (z.B. startet eine Aktivität eine andere Kopie derselben Aktivität, wenn sie den Fokus hat). Andere Instanzen derselben Aktivität können auf anderen Aufgaben (Anwendungen) existieren.

0 Stimmen

Wenn ich also eine neue Instanz einer Aktivität in demselben Prozess starten möchte, aber bereits auf eine frühere Instanz dieser Aktivität FOKUSSIERT habe, wie würde ich das tun?

0 Stimmen

In der Dokumentation steht: "Jedes Mal, wenn es eine neue Absicht für eine "Standard"-Aktivität gibt, wird eine neue Instanz der Klasse erstellt, um auf diese Absicht zu reagieren."

6voto

rbin Punkte 61

Sie können zu derselben bestehenden Instanz von Activity zurückkehren mit android:launchMode="singleInstance"

im Manifest. Wenn Sie zurückkehren zu A から B kann erforderlich sein finish() zu zerstören B .

2voto

huseyin Punkte 1175

Erstens kann die Stapelstruktur untersucht werden. Für den Startmodus:singleTop
Befindet sich bereits eine Instanz derselben Aktivität oben auf dem Aufgabenstapel, wird diese Instanz erneut verwendet, um auf die Absicht zu reagieren.

Alle Aktivitäten werden im Stapel gehalten ("first in last out"). Wenn also Ihre aktuelle Aktivität ganz oben im Stapel liegt und Sie sie in der manifest.file als singleTop definieren

android:name=".ActivityA"
android:launchMode="singleTop"

Wenn Sie in der ActivityA die Aktivität neu erstellen, wird sie nicht onCreate eingeben, sondern onNewIntent() fortsetzen und Sie können sehen, indem Sie eine Benachrichtigung erstellen Nicht:Wenn Sie onNewIntent(Intent) nicht implementieren, werden Sie keine neue Absicht erhalten.

Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);

    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X