Frage

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

Wenn ich gehe zu Aktivität B, C und D da habe ich Menü-Verknüpfungen auf meine Anwendungen Wurzelaktivität zurückzukehren (A).

Der Code sieht wie folgt aus:

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

Doch statt auf die bereits vorhandene Instanz A meine MainActivity.class Rückkehr es eine neue Instanz erstellt -> es geht statt onCreate() onNewIntent()

.

Dies ist nicht das erwartete Verhalten, nicht wahr?

War es hilfreich?

Lösung

Dies sollte den Trick tun.

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

Wenn Sie eine Absicht erstellen die App nutzen zu starten:

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

Dies ist das sollte erforderlich sein.

Andere Tipps

Was für mich tatsächlich arbeitete am Ende war:

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

Zitat aus der Dokumentation :

  

Die "Standard" und "singleTop" -Modi   unterscheiden sich voneinander in einem einzigen   Achtung: Jedes Mal, wenn es neue Absicht   für eine „Standard“ Aktivität, ein neuen   Instanz der Klasse wird erstellt, um   reagieren auf diese Absicht. jede Instanz   Griffe eine einzige Absicht. In ähnlicher Weise ein   neue Instanz eines „singleTop“ activity   kann auch ein neues zu handhaben erstellt werden   Absicht. Allerdings , wenn die Zielaufgabe   verfügt bereits über eine bestehende Instanz   die Aktivität an der Spitze seines   Stapel , wird diese Instanz erhalten   Das neue Intent (in einem onNewIntent ()   Anruf); eine neue Instanz nicht erstellt wird.

Ich bin nicht 100% sicher, was „bereits eine bestehende Instanz der Tätigkeit an der Spitze seines Stapels hat“ bedeutet, aber vielleicht ist Ihre Aktivität diese Bedingung nicht erfüllen.

Würde singleTask oder singleInstance Arbeit für Sie? Oder vielleicht könnten Sie versuchen FLAG_ACTIVITY_SINGLE_TOP Einstellung auf der Absicht, erstellen Sie, um zu sehen, ob das einen Unterschied macht, obwohl ich nicht glaube, es wird.

Sie können auf die gleiche bestehende Instanz Aktivität zurückkehren mit android:launchMode="singleInstance"

im Manifest. Wenn Sie von A B zurückkehren kann finish() benötigt werden B zu zerstören.

Zum einen kann Stack-Struktur untersucht werden. Für den Startmodus: singleTop
Wenn eine Instanz von der gleichen Aktivität ist bereits auf dem Task-Stack, dann wird diese Instanz wiederverwendet zu der Absicht, zu reagieren.

Alle Aktivitäten sind halten, in dem Stapel ( „first in last out“) so, wenn Ihre aktuelle Tätigkeit an der Spitze des Stapels, und wenn Sie es in der manifest.file als singleTop definieren

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

Wenn Sie in der ACTIVITYA sind, die Aktivität neu erstellen nicht betreten werden onCreate wird fortgesetzt onNewIntent () und Sie können durch die Schaffung einer Meldung sehen Nicht gemeinfrei. Wenn Sie nicht über onNewIntent implementieren (Intent) Sie werden nicht neu 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);

        }

Das ist, weil die ursprüngliche A-Aktivität bereits durch die Zeit zerstört wird man es aus B, C oder D. Daher startet, wird onCreate anstelle von onNewIntent () aufgerufen werden. Eine Möglichkeit, dies zu lösen, ist immer zu zerstören die bestehenden A (mit FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK Verbindung, wenn startActivity), bevor ein neuen A beginnt, so onCreate wird immer dann aufgerufen werden, und Sie setzen den Code onNewIntent () in onCreate durch Prüfen, ob getIntent ( ) ist die Absicht, Sie begann mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top